这个霓虹灯代码的速度在ndk中不稳定

时间:2016-08-02 10:24:53

标签: android performance android-ndk neon

我有一段代码,有时花费0.1毫秒但有时10毫秒,有没有人可以为我们提供一些建议

        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);

而且我发现这个代码在三星galaxy s6中的速度比三星galaxy s7更稳定,有没有人可以告诉我为什么

1 个答案:

答案 0 :(得分:3)

所有现代智能手机都使用动态频率调节来平衡CPU和内存系统的性能与电池寿命,大多数高端设备三星芯片组也使用具有两种不同CPU设计的异构SMP(ARM&#34; big.LITTLE&# 34。)

如果您正在运行短代码段,那么&#34; big @ max频率&#34;之间的性能会有很大差异。和&#34; LITTLE @ min频率&#34 ;;特别是因为LITTLE核心上的NEON性能是针对效率而非最大性能而设计的,因此速度会明显慢于大核心。

一般来说,这意味着在进行基准测试时,理想情况下需要稳态持续工作量几秒钟来预热设备,以便在运行实际要测量的代码之前让频率和CPU选择稳定下来