2016-08-02 21 views
0

で安定していない、誰もが彼ら速度は、私は時々、0.1ms、時には10ミリ秒を要したコードのパッチを持ってNDK

 for (uint32_t k = 0; k < 32; k++, dataOff += stp) 
     { 
      uint8x16_t d0 = vld1q_u8((const uint8_t *)dataOff); 
      uint8x16_t d1 = vld1q_u8((const uint8_t *)(dataOff + 16)); 
      maxValue = vmaxq_u8(maxValue, vmaxq_u8(d0, d1)); 
      minValue = vminq_u8(minValue, vminq_u8(d0, d1)); 
     } 
     maxValue1 = vmax_u8(vget_high_u8(maxValue), vget_low_u8(maxValue)); 
     minValue1 = vmin_u8(vget_high_u8(minValue), vget_low_u8(minValue)); 
     maxValue1 = vmax_u8(maxValue1, vext_u8(maxValue1, maxValue1, 4)); 
     minValue1 = vmin_u8(minValue1, vext_u8(minValue1, minValue1, 4)); 
     maxValue1 = vmax_u8(maxValue1, vext_u8(maxValue1, maxValue1, 2)); 
     minValue1 = vmin_u8(minValue1, vext_u8(minValue1, minValue1, 2)); 

     maxValueUchar = __max(vget_lane_u8(maxValue1, 0), vget_lane_u8(maxValue1, 1)); 
     minValueUchar = __min(vget_lane_u8(minValue1, 0), vget_lane_u8(minValue1, 1)); 

     if (maxValueUchar - minValueUchar < hist_th_grid)continue;//bright delta < 64, NO 
     else if (maxValueUchar < hist_th_grid)continue;//all dark, NO 

     dataOff = data; 
     uint16x8_t sum = vdupq_n_u16(0); 
     uint32x4_t sum32; 
     uint8_t sumInt; 
     for (uint32_t k = 0; k < 32; k++, dataOff += stp) 
     { 
      uint8x16_t d0 = vld1q_u8((const uint8_t *)dataOff); 
      uint8x16_t d1 = vld1q_u8((const uint8_t *)(dataOff + 16)); 
      sum = vaddq_u16(sum, vaddq_u16(vpaddlq_u8(d0), vpaddlq_u8(d1))); 
     } 
     sum32 = vpaddlq_u16(sum); 
     sum32 = vaddq_u32(sum32, vextq_u32(sum32, sum32, 2)); 
     sum32 = vaddq_u32(sum32, vextq_u32(sum32, sum32, 1)); 
     sumInt = __min((vgetq_lane_u32(sum32, 0) >> 10) + brt_th_grid,255u); 

のための私にいくつかアドバイスを提供できているとより多くの私は何このコードがsamsung galaxy s7よりもsamsung galaxy s7よりも安定していることがわかりました。なぜ誰に教えてもらえますか?

+1

どのように測定していますか? –

+0

私はopencvのcv :: getTickCount()を使用していますが、測定値は正しいと思います。 –

+0

エラーが発生した場所でテストループを表示する必要があります。 – sh1

答えて

3

現代のスマートフォンはすべて、動的周波数スケーリングを使って、CPUとメモリシステムのパフォーマンスを電池寿命と比較し、 -endデバイスサムスンのチップセットは、2つの異なるCPUデザイン(ARM "big.LITTLE")を持つ異種SMPも使用します。

短いコードスニペットを実行している場合は、 "big @ max frequency"と "LITTLE @ min frequency"の間に大きな違いがあります。特にLITTLEコアのNEON性能は最大性能よりも効率を重視して設計されているため、大きなコアよりもかなり遅くなるからです。

一般に、ベンチマークでは、実際に使用するコードを実行する前に周波数とCPUの選択を安定させるために、デバイスをウォーミングアップするのに理想的には数秒間の定常的な作業負荷が必要です。測定。

関連する問題