小编anu*_*nup的帖子

SIMD代码比标量代码运行得慢

elma并且elmc都是unsigned long数组.所以是res1res2.

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)

c optimization sse simd sse2

5
推荐指数
2
解决办法
3210
查看次数

C程序的可变运行时间

我的(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)

c memory optimization sse

5
推荐指数
0
解决办法
378
查看次数

用于求幂的 SIMD 代码

我正在使用 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)

c optimization simd

4
推荐指数
1
解决办法
775
查看次数

优化提示

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次,点是高内存如果代码要在单个核心机器上执行,那么改进的范围是什么?

c optimization

4
推荐指数
2
解决办法
802
查看次数

标签 统计

c ×4

optimization ×4

simd ×2

sse ×2

memory ×1

sse2 ×1