【问题标题】:I don't understand where I have a problem in code using sse我不明白我在使用 sse 的代码中哪里有问题
【发布时间】:2020-04-19 00:29:38
【问题描述】:

我是 sse 编程的新手。我想编写代码,将向量 v 中的 4 个连续数字相加,并将这个和的结果写在 ans 向量中。我想使用 sse 编写优化的代码。但是当我设置大小等于 4 时,我的程序正在运行。但是当我设置大小为 8 时,我的程序无法运行,并且出现以下错误消息: "抛出异常:读取访问冲突。

ans 是 0x1110112。

如果有这个异常的处理程序,程序可以安全地继续。" 我不明白我哪里有问题。我把内存分配对了,哪里有问题。谁能帮帮我,我将不胜感激。

#include <iostream>
#include <immintrin.h>
#include <pmmintrin.h>
#include <vector>
#include <math.h>  
using namespace std;
arith_t = double
void init(arith_t *&v, size_t size) {
    for (int i = 0; i < size; ++i) {
        v[i] = i / 10.0;
    }
}
//accumulate with sse
void sub_func_sse(arith_t *v, size_t size, int start_idx, arith_t *ans, size_t start_idx_ans) {
    __m128d first_part = _mm_loadu_pd(v + start_idx);
    __m128d second_part = _mm_loadu_pd(v + start_idx + 2);

    __m128d sum = _mm_add_pd(first_part, second_part);
    sum = _mm_hadd_pd(sum, sum);
    _mm_store_pd(ans + start_idx_ans, sum);
}
int main() {
    const size_t size = 8;
    arith_t *v = new arith_t[size];
    arith_t *ans_sse = new arith_t[size / 4];
    init(v, size);
    init(ans_sse, size / 4);
    int num_repeat = 1;
    arith_t total_time_sse = 0;
    for (int p = 0; p < num_repeat; ++p) {
        for (int idx = 0, ans_idx = 0; idx < size; idx += 4, ans_idx++) {
            sub_func_sse(v, size, idx, ans_sse, ans_idx);
        }
    }

    for (size_t i = 0; i < size / 4; ++i) {
        cout << *(ans_sse + i) << endl;
    }
    delete[] ans_sse;
    delete[] v;
}

【问题讨论】:

  • _mm_store_pd 需要 16 字节对齐,new 不能保证(尤其是在 alignof(max_align_t) = 8 的编译器上的 32 位模式下)
  • 我该如何解决?如何使用 16-align 分配新内存?
  • 虽然不是一个好的通用解决方案,但如果您需要对齐内存以用于 _mm_intrinsics,您可以使用 _mm_alloc and friends,这正是您的用例。

标签: c++ sse avx


【解决方案1】:

您正在使用未对齐的内存,这需要特殊版本的加载和存储功能。您正确使用了_mm_loadu_pd,但_mm_store_pd 不适合使用未对齐的内存,因此您应该将其更改为_mm_storeu_pd。还可以考虑使用对齐的内存,这会带来更好的性能。

【讨论】:

    猜你喜欢
    • 2022-08-08
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2022-06-10
    相关资源
    最近更新 更多