Почему этот раздел кода возвращает ошибку "Ошибка сегментации"?
Я векторизую часть моей программы, но она возвращается 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]);
}
}