我的cpu支持到avx2, 没有整数除法。但是Intel提供了svml,可以高效模拟除法和取模运算。
我试着用svml优化了C++,这次时间缩短到3.67秒。
simd还是明显提高了速度。 不过估计整数除法是模拟的,提高远没有8倍那么多。
int intperf3()
{
constexpr int n = 5000 * 10000;
int cc = 1;
int* buf = new int[n];
buf[0] = 2;
int vn = 8;
__m256i zero = _mm256_set_epi32(0, 0, 0, 0, 0, 0, 0, 0);
__m256i one = _mm256_set_epi32(1, 1, 1, 1, 1, 1, 1, 1);
__m256i vi, vj,vk;
for (int i = 3;i <= n;++i)
{
vi = _mm256_set_epi32(i, i, i, i, i, i, i, i);
int flag = 1;
int it = 0;
for (;it < cc-vn;it+=vn)
{
vj = _mm256_set_epi32(buf[it], buf[it + 1], buf[it + 2], buf[it + 3],
buf[it + 4], buf[it + 5], buf[it + 6], buf[it + 7]);
vk = _mm256_rem_epi32(vi, vj);
if (_mm256_testz_si256(_mm256_cmpeq_epi32(vk,zero),one)==0)
{
flag = 0;
break;
}
int j = buf[it];
if (j * j > i)
break;
}
for (;it < cc;++it)
{
int j = buf[it];
if (i % j == 0)
{
flag = 0;
break;
}
if (j * j > i)
break;
}
if (flag) { buf[cc++] = i; }
}
return cc;
}
【 在 leadu 的大作中提到: 】
: avx 等没有除法,优化不了,这个算法只能做partition然后靠cpu或gpu堆,写起来相当麻烦,一没留神就比不优化更慢
:
--
FROM 123.112.64.*