为什么此代码部分返回"分段错误"错误?

时间:2016-03-20 22:32:51

标签: c x86 simd intrinsics avx2

我对我的程序的一部分进行了矢量化,但它返回Segmentation fault错误。这有什么问题?这是导致问题的简化部分。 j++i++正是我想要的,我不想成为j += 16

unsigned short int input[256][256] __attribute__((aligned(32)));//global

for (i = 0; i < 256 - 16; i++) {    
    for (j = 0; j < 256 - 16; j++) {
        temp_v2  =_mm256_load_si256((__m256i *)&input[i][j]);
    }
}

1 个答案:

答案 0 :(得分:2)

如果你真的想要重叠加载,你只需将内循环递增1(正如你在问题中建议的那样),那么你需要使用未对齐的加载指令:

for (i = 0; i < 256; i++) {  
        for (j = 0; j + 16 <= 256; j++) {
           temp_v2 = _mm256_loadu_si256((__m256i *)&input[i][j]);
    }                       ^^^^^
} 

但这将是一个非常奇怪和低效的事情。

<小时/> 通常你会做这样的事情来遍历整个数组:

for (i = 0; i < 256; i++) {  
        for (j = 0; j < 256; j += 16) {
           temp_v2 = _mm256_load_si256((__m256i *)&input[i][j]);
    }
}