【发布时间】:2021-01-02 01:50:07
【问题描述】:
我一直在做一个在线法官的任务:实现int sum(const int* array, unsigned int len) ,让它返回总和的数组。 len可以是20万,这个函数可以调用20万次;我的程序必须在 0.9 秒内执行。
目前,我的代码如下所示:
#include <immintrin.h>
#include <stdio.h>
int sum(const int* array, unsigned int len) {
register int i = 8, s = 0;
__m256i sm = _mm256_loadu_si256((void *)(array));
for (; i+8 < len; i += 8) {
const __m256i x = _mm256_loadu_si256((void *)(array+i));
sm = _mm256_add_epi32(sm, x);
}
sm = _mm256_hadd_epi32(sm, sm);
sm = _mm256_hadd_epi32(sm, sm);
s = _mm256_extract_epi32(sm, 0);
s += _mm256_extract_epi32(sm, 4);
for(; i < len; ++i) s += array[i];
return s;
}
但是,由于法官报告Time limit exceeded,此代码未通过。
谁能指出哪些指令在时间上是昂贵的,以及如何加快我的代码速度?
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c++ intrinsics avx avx2