elma并且elmc都是unsigned long数组.所以是res1和res2.
unsigned long simdstore[2];
__m128i *p, simda, simdb, simdc;
p = (__m128i *) simdstore;
for (i = 0; i < _polylen; i++)
{
u1 = (elma[i] >> l) & 15;
u2 = (elmc[i] >> l) & 15;
for (k = 0; k < 20; k++)
{
//res1[i + k] ^= _mulpre1[u1][k];
//res2[i + k] ^= _mulpre2[u2][k];
simda = _mm_set_epi64x (_mulpre2[u2][k], _mulpre1[u1][k]);
simdb = _mm_set_epi64x (res2[i + k], res1[i + k]); …Run Code Online (Sandbox Code Playgroud) 我的(simd)实现需要不同的时间,尽管它是针对固定输入运行的.运行时间在1亿个时钟周期到1.2亿个时钟周期之间变化.程序调用一个函数大约600次,而函数中最昂贵的部分是在它内存访问〜2000次.因此,我的程序中的整体内存参与程度相当高.
由于内存访问模式/初始内存内容,运行时间是否有变化?
我用valgrind来分析我的程序.它显示每个内存访问大约需要8条指令.这是正常的吗?
以下是600次调用的代码(函数).Mulprev [32] [20]是访问次数最多的数组.
j = 15;
u3v = _mm_set_epi64x (0xF, 0xF);
while (j + 1)
{
l = j << 2;
for (i = 0; i < 20; i++)
{
val1v = _mm_load_si128 ((__m128i *) &elm1v[i]);
uv = _mm_and_si128 (_mm_srli_epi64 (val1v, l), u3v);
u1 = _mm_extract_epi16 (uv, 0);
u2 = _mm_extract_epi16 (uv, 4) + 16;
for (ival = i, ival1 = i + 1, k = 0; k < 20; k += 2, ival += 2, ival1 …Run Code Online (Sandbox Code Playgroud) 我正在使用 SIMD 来计算快速求幂结果。我将时间与非 simd 代码进行了比较。求幂是使用平方和乘法算法实现的。
普通(非simd)版本的代码:
b = 1;
for (i=WPE-1; i>=0; --i){
ew = e[i];
for(j=0; j<BPW; ++j){
b = (b * b) % p;
if (ew & 0x80000000U) b = (b * a) % p;
ew <<= 1;
}
}
Run Code Online (Sandbox Code Playgroud)
SIMD版本:
B.data[0] = B.data[1] = B.data[2] = B.data[3] = 1U;
P.data[0] = P.data[1] = P.data[2] = P.data[3] = p;
for (i=WPE-1; i>=0; --i) {
EW.data[0] = e1[i]; EW.data[1] = e2[i]; EW.data[2] = e3[i]; EW.data[3] = e4[i];
for (j=0; …Run Code Online (Sandbox Code Playgroud) int *s;
allocate memory for s[100];
void func (int *a, int *b)
{
int i;
for (i = 0; i < 100; i++)
{
s[i] = a[i] ^ b[i];
}
}
Run Code Online (Sandbox Code Playgroud)
假设这个特定的代码片段被调用了1000次,这是我代码中最耗时的操作.还假设每次更改a和b的地址.'s'是一个全局变量,使用a和b的不同值集更新.
据我所知,主要的性能瓶颈是内存访问,因为唯一的其他操作是XOR,这非常简单.
您能否建议我如何以最佳方式优化我的代码?
我真的想问的问题,但我认为没有得到恰当的传达,例如,这个for循环包含10个这样的XOR操作,循环计数为100,函数调用1000次,点是高内存如果代码要在单个核心机器上执行,那么改进的范围是什么?