Обычно при написании функции, подобной SIMD, для большого массива данных, которые не могут быть четко разделены по размерам регистров, вы можете выполнить основную часть с помощью SIMD, а затем сделать последнюю часть, используя скалярный код.Однако для кода, который я сейчас пишу, это не простой цикл массива от начала до конца. Вместо этого операции чтения/записи памяти являются в некоторой степени случайными, так что в любой точке цикла мне может потребоваться чтение/запись по адресу, что может привести к чтению/записи за пределами конца массива.
Проведя небольшое исследование, я понял, что могу использовать MaskLoad и MaskStore. Хотя это решает мою проблему с невозможностью чтения/записи за пределами границ, это также снижает производительность.
MaskStore, кажется, увеличивает затрачиваемое время примерно на 30%.
Мне интересно, есть ли альтернатива, которую я могу использовать?
Я читал о BlendVariable, но не думаю, что помогает, так как у вас все еще есть проблема чтения/записи за пределами массива.
Подробнее здесь: https://stackoverflow.com/questions/788 ... erformance