Thanks!!
About the point 2, what’s the data type for acivations and weights in QNNPACK. The code shows that activations are uint8 but weights are void*. 
  
      github.com
  
  
    pytorch/QNNPACK/blob/master/src/q8dwconv/up8x9-neon.c#L18



#include <arm_neon.h>


#include <qnnpack/q8dwconv.h>




void q8dwconv_ukernel_up8x9__neon(
    size_t channels,
    size_t output_width,
    const uint8_t** input,
    const void* weights,
    uint8_t* output,
    size_t input_stride,
    size_t output_increment,
    const union qnnp_conv_quantization_params quantization_params[restrict static 1])
{
  const uint8x8_t vkernel_zero_point = vld1_dup_u8((const uint8_t*) &quantization_params->neon.kernel_zero_point);
  const int32x4_t vmultiplier = vld1q_dup_s32(&quantization_params->neon.multiplier);
  const int32x4_t vright_shift = vld1q_dup_s32(&quantization_params->neon.right_shift);
  const int16x8_t voutput_zero_point = vld1q_dup_s16(&quantization_params->neon.output_zero_point);
  const uint8x8_t voutput_min = vld1_dup_u8(&quantization_params->neon.output_min);