Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

Caffe2でのCPU ThreadPoolをちょっと見てみた

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

TensorFlow Hexagon Delegateに続き、

TVMでもQualcomm Hexagon runtime がサポートされたので、

PyTorchはどうかな?と思って調べていたら、ちょっと気になったコードを発見。

PyTorch、実際には Caffe2 の CPU の ThreadPool のコード => ここ

結構細かく判断していて、最大でも4コアになっている。

size_t getDefaultNumThreads() {
  CAFFE_ENFORCE(cpuinfo_initialize(), "cpuinfo initialization failed");
  int numThreads = cpuinfo_get_processors_count();

  bool applyCap = false;
#if defined(C10_ANDROID)
  applyCap = FLAGS_caffe2_threadpool_android_cap;
#elif defined(C10_IOS)
  applyCap = FLAGS_caffe2_threadpool_ios_cap;
#endif

  if (applyCap) {
    switch (numThreads) {
#if defined(C10_ANDROID) && (CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64)
      case 4:
        switch (cpuinfo_get_core(0)->midr & UINT32_C(0xFF00FFF0)) {
          case UINT32_C(0x51002110): /* Snapdragon 820 Kryo Silver */
          case UINT32_C(0x51002010): /* Snapdragon 821 Kryo Silver */
          case UINT32_C(0x51002050): /* Snapdragon 820/821 Kryo Gold */
          /* Kryo: 2+2 big.LITTLE */
                  numThreads = 2;
                  break;
          default:
          /* Anything else: assume homogeneous architecture */
                  numThreads = 4;
                  break;
          }
        break;
#endif
     case 5:
       /* 4+1 big.LITTLE */
       numThreads = 4;
       break;
     case 6:
       /* 2+4 big.LITTLE */
       numThreads = 2;
       break;
     case 8:
       /* 4+4 big.LITTLE */
       numThreads = 4;
       break;
     case 10:
       /* 4+4+2 Min.Med.Max, running on Med cores */
       numThreads = 4;
       break;
    default:
      if (numThreads > 4) {
        numThreads = numThreads / 2;
      }
      break;
    }
  }
  return numThreads;
}