相关疑难解决方法(0)

C++ 11中的动态对齐内存分配

posix_memalign并且_aligned_malloc在Windows上允许动态分配对齐的内存块.C++ 11中有类似的东西吗?据我所知,该alignas关键字仅适用于静态分配的对象.

c++ c++11

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

重叠数组的总和,自动矢量化和限制

Arstechnia最近有一篇文章为什么一些编程语言比其他语言更快.它比较了Fortran和C,并提到了求和数组.在Fortran中,假设数组不重叠,从而允许进一步优化.在C/C++中,指向相同类型的指针可能会重叠,因此通常不能使用此优化.但是,在C/C++中,可以使用restrictor __restrict关键字告诉编译器不要假设指针重叠.所以我开始研究自动矢量化.

以下代码在GCC和MSVC中进行矢量化

void dot_int(int *a, int *b, int *c, int n) {
    for(int i=0; i<n; i++) {
        c[i] = a[i] + b[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用和不使用重叠数组测试了它,它得到了正确的结果.但是,我使用SSE手动向量化循环的方式不能处理重叠数组.

int i=0;    
for(; i<n-3; i+=4) {
    __m128i a4 = _mm_loadu_si128((__m128i*)&a[i]);
    __m128i b4 = _mm_loadu_si128((__m128i*)&b[i]);
    __m128i c4 = _mm_add_epi32(a4,b4);
    _mm_storeu_si128((__m128i*)c, c4);
}
for(; i<n; i++) {
    c[i] = a[i] + b[i];
}
Run Code Online (Sandbox Code Playgroud)

接下来我尝试使用__restrict.我假设由于编译器可以假设数组不重叠,它不会处理重叠数组,但GCC和MSVC仍然可以获得重叠数组的正确结果,即使是__restrict.

void dot_int_restrict(int * __restrict a, int * __restrict b, int * __restrict c, …
Run Code Online (Sandbox Code Playgroud)

c c++ optimization sse auto-vectorization

9
推荐指数
2
解决办法
1050
查看次数

标签 统计

c++ ×2

auto-vectorization ×1

c ×1

c++11 ×1

optimization ×1

sse ×1