Я хочу хранить данные в большом массиве с _mm256_stream_si256()
, вызываемым в цикле.
Как я понял, забор памяти необходим, чтобы сделать эти изменения видимыми для других потоков. Описание _mm_sfence()
говорит
Выполните операцию сериализации во всех инструкциях хранения в память которые были выданы до этой инструкции. Гарантирует, что каждый хранимая команда, которая предшествует, в программном порядке, отображается глобально перед любой инструкцией хранить, которая следует за забором в порядке выполнения программы.
Но будут ли мои последние магазины текущего потока видны последующим инструкциям load тоже (в других потоках)? Или мне нужно позвонить _mm_mfence()
? (Последний кажется медленным)
ОБНОВЛЕНИЕ: Я раньше видел этот вопрос: когда следует использовать _mm_sfence _mm_lfence и _mm_mfence. Ответы там скорее сосредоточены на том, когда использовать забор в целом. Мой вопрос более конкретный, и ответы в этом вопросе вряд ли будут устранены (и в настоящее время этого не делают).
UPDATE2: следуя комментариям/ответам, определите "последующие нагрузки" как нагрузки в потоке, которые впоследствии берут блокировку, которая в настоящий момент поддерживается текущим потоком.