为啥此代码部分返回“分段错误”错误?

Posted

技术标签:

【中文标题】为啥此代码部分返回“分段错误”错误?【英文标题】:Why this code section return "Segmentation fault" error?为什么此代码部分返回“分段错误”错误? 【发布时间】:2016-03-20 22:32:50 【问题描述】:

我正在对程序的一部分进行矢量化,但它返回 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]);
    

【问题讨论】:

如果标准功能可用,请勿使用专有扩展。 C 提供了_Alignas 说明符。 你的代码违反了严格的别名 在 gcc 中我使用__attribute__(( aligned(X))) ,以前没有遇到过这样的问题。我可以为严格的别名做些什么? 在这种情况下不要担心严格的别名 - 你可以像这样使用带有内在函数的强制转换。 gcc 对齐指令也很好 - 人们只是在挑剔。 【参考方案1】:

如果您确实想要重叠加载,只需将内部循环增加 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]);
    
 

【讨论】:

以上是关于为啥此代码部分返回“分段错误”错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?

为啥此代码会为大输入提供分段错误

为啥在此代码中调用虚拟方法时会出现分段错误?

为啥存储此向量时会出现分段错误?

为啥我的字符串分配会导致分段错误?

为啥在使用 Python/C API 时会出现此段错误?