2016-08-02 24 views
0

穩定我的代碼補丁,有時會花費0.1毫秒,但有時爲10ms,有沒有人能提供給我一些建議讓他們在這個霓虹代碼的速度是不是在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); 

更糟糕的是我發現這個代碼在三星s6比samsung galaxy s7有更穩定的速度,有沒有人可以告訴我爲什麼

+1

你怎麼測量它? –

+0

我使用opencv的cv :: getTickCount(),我認爲測量是正確的 –

+0

您需要顯示您的測試循環,這更可能出現錯誤來自何處。 – sh1

回答

3

所有現代智能手機都使用動態頻率調整來平衡CPU和內存系統的性能,以抵禦電池壽命,大部分高 - 終端設備三星芯片組還採用異構SMP和兩種不同的CPU設計(ARM「big.LITTLE」)。

如果您正在運行短代碼片段,「big @ max frequency」和「LITTLE @ min frequency」之間的性能差異很大;特別是因爲LITTLE核心上的NEON性能是爲了效率而非最大性能而設計的,所以它將比大內核慢得多。

一般來說,這意味着當進行基準測試時,理想情況下需要穩定狀態的持續工作負載幾秒鐘以預熱設備,以便在運行代碼之前讓頻率和CPU選擇穩定下來測量。