!12734 [ms][lite][cpu] transpose optimize
From: @lzkcode Reviewed-by: Signed-off-by:pull/12734/MERGE
commit
16a9aa37af
File diff suppressed because it is too large
Load Diff
@ -1,140 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright 2020 Huawei Technologies Co., Ltd
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef ENABLE_SSE
|
|
||||||
#include <x86intrin.h>
|
|
||||||
#include "nnacl/pack.h"
|
|
||||||
#include "nnacl/int8/conv_int8.h"
|
|
||||||
|
|
||||||
void PackNHWCToNCHWFp32(const void *src, void *dst, int batches, int plane, int channel) {
|
|
||||||
int hw8 = plane / C8NUM * C8NUM;
|
|
||||||
int c8 = channel / C8NUM * C8NUM;
|
|
||||||
int batch = plane * channel;
|
|
||||||
for (int n = 0; n < batches; n++) {
|
|
||||||
const float *src_batch = (const float *)src + n * batch;
|
|
||||||
float *dst_batch = (float *)dst + n * batch;
|
|
||||||
int hw = 0;
|
|
||||||
for (; hw < hw8; hw += C8NUM) {
|
|
||||||
int c = 0;
|
|
||||||
for (; c < c8; c += C8NUM) {
|
|
||||||
const float *src_ptr = src_batch + hw * channel + c;
|
|
||||||
float *dst_ptr = dst_batch + c * plane + hw;
|
|
||||||
|
|
||||||
// 11-14
|
|
||||||
__m128 v0_ma = _mm_loadu_ps(src_ptr);
|
|
||||||
__m128 v1_ma = _mm_loadu_ps(src_ptr + channel);
|
|
||||||
__m128 v2_ma = _mm_loadu_ps(src_ptr + 2 * channel);
|
|
||||||
__m128 v3_ma = _mm_loadu_ps(src_ptr + 3 * channel);
|
|
||||||
|
|
||||||
__m128 v4_ma = _mm_unpacklo_ps(v0_ma, v1_ma);
|
|
||||||
__m128 v5_ma = _mm_unpackhi_ps(v0_ma, v1_ma);
|
|
||||||
__m128 v6_ma = _mm_unpacklo_ps(v2_ma, v3_ma);
|
|
||||||
__m128 v7_ma = _mm_unpackhi_ps(v2_ma, v3_ma);
|
|
||||||
|
|
||||||
__m128 v8_ma = _mm_movelh_ps(v4_ma, v6_ma);
|
|
||||||
__m128 v9_ma = _mm_movehl_ps(v6_ma, v4_ma);
|
|
||||||
__m128 v10_ma = _mm_movelh_ps(v5_ma, v7_ma);
|
|
||||||
__m128 v11_ma = _mm_movehl_ps(v7_ma, v5_ma);
|
|
||||||
|
|
||||||
_mm_storeu_ps(dst_ptr, v8_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + plane, v9_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + 2 * plane, v10_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + 3 * plane, v11_ma);
|
|
||||||
|
|
||||||
// 15-18
|
|
||||||
v0_ma = _mm_loadu_ps(src_ptr + C4NUM);
|
|
||||||
v1_ma = _mm_loadu_ps(src_ptr + channel + C4NUM);
|
|
||||||
v2_ma = _mm_loadu_ps(src_ptr + 2 * channel + C4NUM);
|
|
||||||
v3_ma = _mm_loadu_ps(src_ptr + 3 * channel + C4NUM);
|
|
||||||
|
|
||||||
v4_ma = _mm_unpacklo_ps(v0_ma, v1_ma);
|
|
||||||
v5_ma = _mm_unpackhi_ps(v0_ma, v1_ma);
|
|
||||||
v6_ma = _mm_unpacklo_ps(v2_ma, v3_ma);
|
|
||||||
v7_ma = _mm_unpackhi_ps(v2_ma, v3_ma);
|
|
||||||
|
|
||||||
v8_ma = _mm_movelh_ps(v4_ma, v6_ma);
|
|
||||||
v9_ma = _mm_movehl_ps(v6_ma, v4_ma);
|
|
||||||
v10_ma = _mm_movelh_ps(v5_ma, v7_ma);
|
|
||||||
v11_ma = _mm_movehl_ps(v7_ma, v5_ma);
|
|
||||||
|
|
||||||
_mm_storeu_ps(dst_ptr + C4NUM * plane, v8_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + (C4NUM + 1) * plane, v9_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + (C4NUM + 2) * plane, v10_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + (C4NUM + 3) * plane, v11_ma);
|
|
||||||
|
|
||||||
// 21-24
|
|
||||||
v0_ma = _mm_loadu_ps(src_ptr + C4NUM * channel);
|
|
||||||
v1_ma = _mm_loadu_ps(src_ptr + (C4NUM + 1) * channel);
|
|
||||||
v2_ma = _mm_loadu_ps(src_ptr + (C4NUM + 2) * channel);
|
|
||||||
v3_ma = _mm_loadu_ps(src_ptr + (C4NUM + 3) * channel);
|
|
||||||
|
|
||||||
v4_ma = _mm_unpacklo_ps(v0_ma, v1_ma);
|
|
||||||
v5_ma = _mm_unpackhi_ps(v0_ma, v1_ma);
|
|
||||||
v6_ma = _mm_unpacklo_ps(v2_ma, v3_ma);
|
|
||||||
v7_ma = _mm_unpackhi_ps(v2_ma, v3_ma);
|
|
||||||
|
|
||||||
v8_ma = _mm_movelh_ps(v4_ma, v6_ma);
|
|
||||||
v9_ma = _mm_movehl_ps(v6_ma, v4_ma);
|
|
||||||
v10_ma = _mm_movelh_ps(v5_ma, v7_ma);
|
|
||||||
v11_ma = _mm_movehl_ps(v7_ma, v5_ma);
|
|
||||||
|
|
||||||
_mm_storeu_ps(dst_ptr + C4NUM, v8_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + plane + C4NUM, v9_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + 2 * plane + C4NUM, v10_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + 3 * plane + C4NUM, v11_ma);
|
|
||||||
|
|
||||||
// 25-28
|
|
||||||
v0_ma = _mm_loadu_ps(src_ptr + C4NUM * channel + C4NUM);
|
|
||||||
v1_ma = _mm_loadu_ps(src_ptr + (C4NUM + 1) * channel + C4NUM);
|
|
||||||
v2_ma = _mm_loadu_ps(src_ptr + (C4NUM + 2) * channel + C4NUM);
|
|
||||||
v3_ma = _mm_loadu_ps(src_ptr + (C4NUM + 3) * channel + C4NUM);
|
|
||||||
|
|
||||||
v4_ma = _mm_unpacklo_ps(v0_ma, v1_ma);
|
|
||||||
v5_ma = _mm_unpackhi_ps(v0_ma, v1_ma);
|
|
||||||
v6_ma = _mm_unpacklo_ps(v2_ma, v3_ma);
|
|
||||||
v7_ma = _mm_unpackhi_ps(v2_ma, v3_ma);
|
|
||||||
|
|
||||||
v8_ma = _mm_movelh_ps(v4_ma, v6_ma);
|
|
||||||
v9_ma = _mm_movehl_ps(v6_ma, v4_ma);
|
|
||||||
v10_ma = _mm_movelh_ps(v5_ma, v7_ma);
|
|
||||||
v11_ma = _mm_movehl_ps(v7_ma, v5_ma);
|
|
||||||
|
|
||||||
_mm_storeu_ps(dst_ptr + C4NUM * plane + C4NUM, v8_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + (C4NUM + 1) * plane + C4NUM, v9_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + (C4NUM + 2) * plane + C4NUM, v10_ma);
|
|
||||||
_mm_storeu_ps(dst_ptr + (C4NUM + 3) * plane + C4NUM, v11_ma);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; c < channel; c++) {
|
|
||||||
const float *src_ptr = src_batch + hw * channel + c;
|
|
||||||
float *dst_ptr = dst_batch + c * plane + hw;
|
|
||||||
for (size_t i = 0; i < C8NUM; i++) {
|
|
||||||
dst_ptr[i] = src_ptr[i * channel];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (; hw < plane; hw++) {
|
|
||||||
const float *src_ptr = src_batch + hw * channel;
|
|
||||||
float *dst_ptr = dst_batch + hw;
|
|
||||||
for (size_t i = 0; i < channel; i++) {
|
|
||||||
dst_ptr[i * plane] = src_ptr[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in new issue