Почему этот раздел кода возвращает ошибку "Ошибка сегментации"?

Я векторизую часть моей программы, но она возвращается 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 ответ

Решение

Если вы действительно хотите перекрывающихся нагрузок, когда вы просто увеличиваете внутренний цикл на 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]);
    }
} 
Другие вопросы по тегам