Посмотрите на это с точки зрения вашей общей работы.По порядку вы:
- Читаете один непрерывный блок памяти.
- Выполняете одну операцию с каждым значением этой памяти.
- Записываете результатэта операция в другой блок памяти.
Ваш код никогда не должен читать значение более одного раза.И хотя написанный код потенциально записывает значение дважды, нет никаких причин, по которым должен .Вы также можете легко вычислить значение, основанное на условии, и затем записать это значение в память.И я предполагаю, что хороший компилятор преобразует ваш код именно в это.
Поскольку никакие потоки не читают и не пишут в более чем одно местоположение одновременно, кэшированный доступ к памяти помогает только в том, что он позволяет поворачивать "читать X байтов "в более эффективные" читать байты кэширования "читать.Два вызова, которые пытаются прочитать адреса, которые находятся в одной и той же строке кэша, должны выполнять только одну выборку из памяти.То же самое касается письма;несколько вызовов, записывающих в одну и ту же строку кэша, должны быть объединены в одну запись.
Конечно, это предполагает разумное аппаратное обеспечение.
Это остается гипотетически возможным для такой системывызвать несколько операций чтения / записи из одной и той же памяти.Это связано с количеством вызовов в деформации / волновом фронте (т. Е. С числом вызовов шейдера, который выполняется в режиме блокировки).Если размер данных, считываемых за деформацию, не выровнен по кешу, два деформации могут выполнить чтение для одной и той же строки кеша, поскольку разные деформации могут выполняться одновременно.То же самое касается записи.Но даже это предполагает, что кэш-память и решение о выполнении выборки памяти принимаются на основе деформации.
Независимо от того, если это должно быть определено, правильное решение для этого заключается в выравниваниичитать как можно лучше, а не пытаться выполнить для него работу кэша.
Бывают случаи, когда предварительное кэширование данных было бы полезно, но это в основном происходит в тех случаях, когда вызовы часто читают изодни и те же адреса, и обычно, когда они читают из памяти друг друга.Даже тогда это то, что вы должны профилировать, а не пытаться так кодировать априори.