相关疑难解决方法(0)

如何告诉GCC指针参数始终是双字对齐的?

在我的程序中,我有一个功能,可以添加一个简单的向量c[0:15] = a[0:15] + b[0:15].功能原型是:

void vecadd(float * restrict a, float * restrict b, float * restrict c);
Run Code Online (Sandbox Code Playgroud)

在我们的32位嵌入式架构中,有一个加载/存储双字加载/存储选项,如:

r16 = 0x4000  ;
strd r0,[r16] ; stores r0 in [0x4000] and r1 in [0x4004]
Run Code Online (Sandbox Code Playgroud)

GCC优化器识别循环的向量性质并生成代码的两个分支 - 一个用于3个数组是双字对齐的情况(因此它使用双重加载/存储指令)而另一个用于数组的情况是字对齐的(它使用单个加载/存储选项).

问题是地址对齐检查相对于加法部分是昂贵的,我想通过暗示编译器a,b和c始终是8对齐来消除它.是否有一个修饰符添加到指针声明以告诉编译器?

用于调用此函数的数组具有aligned(8)属性,但它不会反映在函数代码本身中.是否可以将此属性添加到函数参数?

c gcc c99 alignment

25
推荐指数
3
解决办法
1万
查看次数

Linux中mmap的物理内存在用户空间中的memcpy性能不佳

在我的计算机上安装的192GB RAM中,我在启动时由Linux内核保留了大于4GB(硬件地址为0x100000000)的188GB RAM(mem = 4G memmap = 188G $ 4G).数据采集​​内核模块使用DMA将数据累积到用作环形缓冲区的大区域中.用户空间应用程序mmap将此环形缓冲区放入用户空间,然后从当前位置的环形缓冲区复制块,以便在它们准备好后进行处理.

使用memcpy从mmap的区域复制这些16MB块不会像我预期的那样执行.看起来性能取决于启动时保留的内存大小(以及后来mmap进入用户空间). http://www.wurmsdobler.org/files/resmem.zip包含实现mmap文件操作的内核模块的源代码:

module_param(resmem_hwaddr, ulong, S_IRUSR);
module_param(resmem_length, ulong, S_IRUSR);
//...
static int resmem_mmap(struct file *filp, struct vm_area_struct *vma) {
remap_pfn_range(vma, vma->vm_start,
    resmem_hwaddr >> PAGE_SHIFT,
    resmem_length, vma->vm_page_prot);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

和测试应用程序,实质上(删除检查):

#define BLOCKSIZE ((size_t)16*1024*1024)
int resMemFd = ::open(RESMEM_DEV, O_RDWR | O_SYNC);
unsigned long resMemLength = 0;
::ioctl(resMemFd, RESMEM_IOC_LENGTH, &resMemLength);
void* resMemBase = ::mmap(0, resMemLength, PROT_READ | PROT_WRITE, MAP_SHARED, resMemFd, 4096);
char* source = ((char*)resMemBase) + RESMEM_HEADER_SIZE;    
char* destination = new char[BLOCKSIZE]; …
Run Code Online (Sandbox Code Playgroud)

linux memory mmap

9
推荐指数
1
解决办法
2354
查看次数

gcc内存对齐pragma

gcc是否具有内存对齐编译指示,类似于#pragma vector aligned英特尔编译器?我想告诉编译器使用对齐的加载/存储指令优化特定的循环.为了避免可能的混淆,这不是结构包装.

例如:

#if defined (__INTEL_COMPILER)
#pragma vector aligned
#endif
        for (int a = 0; a < int(N); ++a) {
            q10 += Ix(a,0,0)*Iy(a,1,1)*Iz(a,0,0);
            q11 += Ix(a,0,0)*Iy(a,0,1)*Iz(a,1,0);
            q12 += Ix(a,0,0)*Iy(a,0,0)*Iz(a,0,1);
            q13 += Ix(a,1,0)*Iy(a,0,0)*Iz(a,0,1);
            q14 += Ix(a,0,0)*Iy(a,1,0)*Iz(a,0,1);
            q15 += Ix(a,0,0)*Iy(a,0,0)*Iz(a,1,1);
        }
Run Code Online (Sandbox Code Playgroud)

谢谢

memory optimization gcc pragma alignment

8
推荐指数
2
解决办法
1万
查看次数

C++ Cache性能奇怪的行为

我读了一篇文章(1.5岁http://www.drdobbs.com/parallel/cache-friendly-code-solving-manycores-ne/240012736),其中讨论了缓存性能和数据大小.他们展示了以下代码,他们说这些代码是在i7(沙桥)上运行的

static volatile int array[Size];
static void test_function(void)
{
    for (int i = 0; i < Iterations; i++)
        for (int x = 0; x < Size; x++)
          array[x]++;
}
Run Code Online (Sandbox Code Playgroud)

他们声称如果他们保持Size*Iterations不变,增加Size,当数组内存中的大小增加超过L2缓存大小时,他们会观察到执行时间(10x)的巨大峰值.

作为我自己的练习,我想尝试一下,看看我是否可以为我的机器重现他们的结果.(i7 3770k,win7,visual c ++ 2012编译器,Win32调试模式,未启用优化).令我惊讶的是,我无法看到执行所花费的时间增加(甚至超过L3缓存大小),这让我觉得编译器在某种程度上优化了这段代码.但我也没有看到任何优化.我看到的唯一的速度变化是,在我的机器的字大小以下,它需要稍长.以下是我的时间,代码清单和相关的反汇编.

有谁知道原因:

1)为什么不管阵列的大小如何,所用的时间都不会增加?或者我怎么能找到?

2)为什么所花费的时间从高处开始然后减小直到达到缓存行大小,如果数据小于行大小,是否应该在没有从缓存读取的情况下处理更多迭代?


时序:

Size=1,Iterations=1073741824, Time=3829
Size=2,Iterations=536870912, Time=2625
Size=4,Iterations=268435456, Time=2563
Size=16,Iterations=67108864, Time=2906
Size=32,Iterations=33554432, Time=3469
Size=64,Iterations=16777216, Time=3250
Size=256,Iterations=4194304, Time=3140
Size=1024,Iterations=1048576, Time=3110
Size=2048,Iterations=524288, Time=3187
Size=4096,Iterations=262144, Time=3078
Size=8192,Iterations=131072, Time=3125
Size=16384,Iterations=65536, Time=3109
Size=32768,Iterations=32768, Time=3078
Size=65536,Iterations=16384, Time=3078
Size=262144,Iterations=4096, Time=3172
Size=524288,Iterations=2048, Time=3109
Size=1048576,Iterations=1024, Time=3094
Size=2097152,Iterations=512, Time=3313
Size=4194304,Iterations=256, Time=3391
Size=8388608,Iterations=128, …
Run Code Online (Sandbox Code Playgroud)

c++ performance caching

5
推荐指数
1
解决办法
1413
查看次数

标签 统计

alignment ×2

gcc ×2

memory ×2

c ×1

c++ ×1

c99 ×1

caching ×1

linux ×1

mmap ×1

optimization ×1

performance ×1

pragma ×1