我这里从12秒多降低到2秒,cpu是AMD 3700X
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
cc = 3001134
time: 2.093 (GetTickCount64)
time: 2.094 (QueryPerformanceCounter)
c:\temp\test_LIEF\ConsoleApplication1\x64\Release>ConsoleApplication1.exe
cc = 3001134
time: 2.094 (GetTickCount64)
time: 2.091 (QueryPerformanceCounter)
simd循环之后是可以continue跳过后面那个非simd的循环的
int intperf2() {
static const int zeroVector[8] = {0, 0, 0, 0, 0, 0, 0, 0};
static const int oneVector[8] = {1, 1, 1, 1, 1, 1, 1, 1};
__m256i zero = _mm256_loadu_si256((const __m256i *)zeroVector);
__m256i one = _mm256_loadu_si256((const __m256i *)oneVector);
int cc = 1;
buf[0] = 2;
for (int i = 3; i <= n; ++i) {
int flag = 1;
__m256i first = _mm256_setr_epi32(i, i, i, i, i, i, i, i);
int upperBound = cc & ~(8 - 1);
for (int it = 0; it < upperBound; it += 8) {
int j = buf[it];
if (j * j > i)
break;
__m256i second = _mm256_loadu_si256((const __m256i *)&buf[it]);
__m256i remainder = _mm256_rem_epi32(first, second);
if (_mm256_testz_si256(_mm256_cmpeq_epi32(remainder, zero), one) == 0) {
flag = 0;
break;
}
}
if (!flag)
continue;
for (int it = upperBound; it < cc; ++it) {
int j = buf[it];
if (j * j > i)
break;
if (i % j == 0) {
flag = 0;
break;
}
}
if (flag) {
buf[cc++] = i;
}
}
return cc;
}
【 在 finlab 的大作中提到: 】
: 我的cpu支持到avx2, 没有整数除法。但是Intel提供了svml,可以高效模拟除法和取模运算。
: 我试着用svml优化了C++,这次时间缩短到3.67秒。
: simd还是明显提高了速度。 不过估计整数除法是模拟的,提高远没有8倍那么多。
: ...................
--
修改:z16166 FROM 114.245.195.*
FROM 114.245.195.*