@@ -158,6 +158,7 @@ static void ggmlqnn_compute_timestep_embedding(ggml_backend_qnn_context * ctx,
158158static void ggmlqnn_compute_diag_mask (ggml_backend_qnn_context * ctx, ggml_tensor * dst, float value);
159159
160160static size_t ggmlqnn_get_op_index (const ggml_tensor * tensor);
161+ static const char * ggmlqnn_get_hwaccel_approach_name (int hwaccle_approach);
161162static void * ggmlqnn_type_trait (ggml_backend_qnn_context * ctx, ggml_tensor * op);
162163static void ggmlqnn_get_opkey_from_op (const ggml_tensor * op, std::string & output);
163164
@@ -875,6 +876,33 @@ static void ggmlqnn_dump_tensor(const ggml_tensor * tensor, const char * name) {
875876 GGMLQNN_LOG_DEBUG (" \n " );
876877}
877878
879+ static void ggmlqnn_get_timestring (char * p_currenttime) {
880+ time_t n_seconds = 0 ;
881+ struct tm * p_tm = nullptr ;
882+
883+ if (nullptr == p_currenttime)
884+ return ;
885+
886+ time (&n_seconds);
887+ p_tm = localtime (&n_seconds);
888+ snprintf (p_currenttime, GGML_QNN_TMPBUF_LEN, " %04d-%02d-%02d,%02d:%02d:%02d" ,
889+ p_tm->tm_year + 1900 , p_tm->tm_mon + 1 , p_tm->tm_mday ,
890+ p_tm->tm_hour , p_tm->tm_min , p_tm->tm_sec );
891+ }
892+
893+ static void ggmlqnn_print_running_timestamp (ggml_backend_qnn_context * ctx) {
894+ GGMLQNN_LOG_INFO (" hwaccel approach is %d(%s)" , g_qnn_params.hwaccel_approach ,
895+ ggmlqnn_get_hwaccel_approach_name (g_qnn_params.hwaccel_approach ));
896+ char timestamp[GGML_QNN_TMPBUF_LEN];
897+ ggmlqnn_get_timestring (timestamp);
898+ if (HWACCEL_CDSP == g_qnn_params.hwaccel_approach ) {
899+ GGMLQNN_LOG_INFO (" only offload GGML_OP_ADD : %s" , g_qnn_params.enable_q_mulmat ? " NO" : " YES" );
900+ } else {
901+ GGMLQNN_LOG_INFO (" only offload GGML_OP_ADD: NO" );
902+ }
903+ GGMLQNN_LOG_INFO (" running timestamp:%s" , timestamp);
904+ }
905+
878906class qnn_perf {
879907public:
880908 qnn_perf (const std::string & perf_name) : _perf_name(std::move(perf_name)) {};
@@ -1065,20 +1093,6 @@ static char * ggmlqnn_strndup(const char * source, size_t maxlen) {
10651093#endif
10661094}
10671095
1068- static void ggmlqnn_get_timestring (char * p_currenttime) {
1069- time_t n_seconds = 0 ;
1070- struct tm * p_tm = nullptr ;
1071-
1072- if (nullptr == p_currenttime)
1073- return ;
1074-
1075- time (&n_seconds);
1076- p_tm = localtime (&n_seconds);
1077- snprintf (p_currenttime, GGML_QNN_TMPBUF_LEN, " %04d-%02d-%02d-%02d-%02d-%02d" ,
1078- p_tm->tm_year + 1900 , p_tm->tm_mon + 1 , p_tm->tm_mday ,
1079- p_tm->tm_hour , p_tm->tm_min , p_tm->tm_sec );
1080- }
1081-
10821096// =================================================================================================
10831097// section-5: QNN helper function
10841098// =================================================================================================
@@ -2123,7 +2137,7 @@ static int ggmlhexagon_init_dsp(ggml_backend_qnn_context * ctx) {
21232137
21242138static void ggmlhexagon_close_cdsp (ggml_backend_qnn_context * ctx) {
21252139 int hexagon_error = AEE_SUCCESS;
2126- GGMLQNN_LOG_DEBUG (" enter %s" , __func__);
2140+ GGMLQNN_LOG_INFO (" enter %s" , __func__);
21272141 if (-1 != ctx->ggmlop_handle ) {
21282142 hexagon_error = ggmlop_dsp_close (ctx->ggmlop_handle );
21292143 if (AEE_SUCCESS != hexagon_error) {
@@ -2139,7 +2153,7 @@ static void ggmlhexagon_close_cdsp(ggml_backend_qnn_context * ctx) {
21392153 ctx->rpc_mempool_len = 0 ;
21402154 ctx->domain_id = -1 ;
21412155 }
2142- GGMLQNN_LOG_DEBUG (" leave %s" , __func__);
2156+ GGMLQNN_LOG_INFO (" leave %s" , __func__);
21432157}
21442158
21452159static void ggmlhexagon_compute (ggml_backend_qnn_context * ctx, struct ggml_tensor * op) {
@@ -3693,7 +3707,7 @@ int qnn_instance::qnn_finalize() {
36933707 int ret_status = 0 ;
36943708 Qnn_ErrorHandle_t error = QNN_SUCCESS;
36953709
3696- GGMLQNN_LOG_DEBUG (" enter %s\n " , __func__);
3710+ GGMLQNN_LOG_INFO (" enter %s\n " , __func__);
36973711 ggmlqnn_reset_idx ();
36983712
36993713 free_rpcmem ();
@@ -3760,7 +3774,7 @@ int qnn_instance::qnn_finalize() {
37603774 unload_backend ();
37613775 unload_system ();
37623776
3763- GGMLQNN_LOG_DEBUG (" leave %s\n " , __func__);
3777+ GGMLQNN_LOG_INFO (" leave %s\n " , __func__);
37643778 return ret_status;
37653779}
37663780
@@ -4149,20 +4163,13 @@ static Qnn_OpConfig_t ggmlqnn_create_op_config(const char * name, const char * p
41494163 return opcfg;
41504164}
41514165
4152- static Qnn_Tensor_t * ggmlqnn_create_general_tensor (qnn_instance * instance, Qnn_GraphHandle_t graph_handle,
4153- const ggml_tensor * tensor, const char * name,
4154- Qnn_TensorType_t qnn_tensor_type,
4155- Qnn_DataType_t qnn_data_type,
4156- uint32_t rank, uint32_t * dims,
4157- void * data, uint32_t data_size,
4158- bool b_transpose = false );
41594166static Qnn_Tensor_t * ggmlqnn_create_general_tensor (qnn_instance * instance, Qnn_GraphHandle_t graph_handle,
41604167 const ggml_tensor * tensor, const char * name,
41614168 Qnn_TensorType_t qnn_tensor_type,
41624169 Qnn_DataType_t qnn_data_type,
41634170 uint32_t rank, uint32_t * dims,
41644171 void * data, uint32_t data_size,
4165- bool b_transpose) {
4172+ bool b_transpose = false ) {
41664173 Qnn_ErrorHandle_t error = QNN_SUCCESS;
41674174 char tensor_name[GGML_MAX_NAME] = {};
41684175
@@ -4196,14 +4203,6 @@ static Qnn_Tensor_t * ggmlqnn_create_general_tensor(qnn_instance * instance, Qnn
41964203
41974204 ggmlqnn_get_qnn_dimensions_from_ggml_dimensions (transpose_dims, reverse_dims, ggml_n_dims (tensor));
41984205 tensor_dims = transpose_dims;
4199- #if 0
4200- for (size_t idx = 0; idx < 4; idx++) {
4201- GGMLQNN_LOG_DEBUG("origin dim[%d]=%d\n", idx, reverse_dims[idx]);
4202- }
4203- for (size_t idx = 0; idx < 4; idx++) {
4204- GGMLQNN_LOG_DEBUG("trans dim[%d]=%d\n", idx, transpose_dims[idx]);
4205- }
4206- #endif
42074206 }
42084207
42094208 Qnn_Tensor_t qnn_tensor = {
@@ -4763,11 +4762,6 @@ static const char * ggml_backend_qnn_name(ggml_backend_t backend) {
47634762static void ggml_backend_qnn_free (ggml_backend_t backend) {
47644763 GGMLQNN_LOG_DEBUG (" enter %s" , __func__ );
47654764 ggml_backend_qnn_context * ctx = (ggml_backend_qnn_context *)backend->context ;
4766- GGMLQNN_LOG_DEBUG (" device idx %d, name:%s" , ctx->device , g_qnn_mgr[ctx->device ].name );
4767-
4768- if (HWACCEL_CDSP == g_qnn_params.hwaccel_approach ) {
4769- ggmlhexagon_close_cdsp (ctx);
4770- }
47714765
47724766 qnn_instance * instance = (qnn_instance*)g_qnn_mgr[ctx->device ].instance ;
47734767 if (instance != nullptr ) {
@@ -4791,8 +4785,13 @@ static void ggml_backend_qnn_free(ggml_backend_t backend) {
47914785 }
47924786
47934787 if (g_qnn_mgr[ctx->device ].backend != nullptr ) {
4788+ if (HWACCEL_CDSP == g_qnn_params.hwaccel_approach ) {
4789+ ggmlhexagon_close_cdsp (ctx);
4790+ }
4791+
47944792 delete backend;
47954793 g_qnn_mgr[ctx->device ].backend = nullptr ;
4794+ ggmlqnn_print_running_timestamp (ctx);
47964795 }
47974796 GGMLQNN_LOG_DEBUG (" leave %s" , __func__ );
47984797}
@@ -5155,7 +5154,7 @@ const char * ggml_backend_qnn_get_devname(size_t dev_num) {
51555154
51565155static qnn_instance * ggmlqnn_init_qnn_instance (size_t device, const char * qnn_lib_path) {
51575156 int result = 0 ;
5158- GGMLQNN_LOG_INFO (" inference approach=%d(%s)" , g_qnn_params.hwaccel_approach ,
5157+ GGMLQNN_LOG_INFO (" hwaccel approach=%d(%s)" , g_qnn_params.hwaccel_approach ,
51595158 ggmlqnn_get_hwaccel_approach_name (g_qnn_params.hwaccel_approach ));
51605159
51615160 qnn_instance * instance = nullptr ;
@@ -5219,7 +5218,7 @@ ggml_backend_t ggml_backend_qnn_init(size_t device, const char * qnn_lib_path) {
52195218 return g_qnn_mgr[device].backend ;
52205219 }
52215220
5222- // don't initialize QNN when inference approach is offload ggml op to Hexagon cDSP directly
5221+ // don't initialize QNN when hwaccel approach is offload ggml op to Hexagon cDSP directly
52235222 if (HWACCEL_CDSP != g_qnn_params.hwaccel_approach ) {
52245223 qnn_instance * instance = ggmlqnn_init_qnn_instance (device, qnn_lib_path);
52255224 if (nullptr == instance)
@@ -5287,7 +5286,7 @@ static inline bool ggmlqnn_is_valid_params(ggml_backend_qnn_context * ctx, const
52875286}
52885287
52895288/*
5290- * provide a general skeleton to offload ggml op to QNN backend or Hexagon cDSP : perform element-wise
5289+ * provide a general skeleton to offload ggml op to QNN backend: perform element-wise
52915290 * operation on 1/2 input tensors and 1 output tensors
52925291*/
52935292static void ggmlqnn_compute_elementwise (ggml_backend_qnn_context * ctx, ggml_tensor * op) {
0 commit comments