2011-01-14 2 views
3

Недавно я задал вопрос о using volatile и получил информативные статьи от Intel и другие, в которых обсуждались барьеры памяти и их использование. После прочтения этих статей я стал довольно параноидальным.Безопасность memcpy() в смежных областях памяти

У меня 64-разрядная машина. Безопасно ли memcpy в соседние, неперекрывающиеся области памяти из нескольких потоков? Например, скажем, у меня есть буфер:

char buff[10]; 

ли это всегда безопасно для одного потока к тетсру в первые 5 байт, а второй поток копирует в последние 5 байт?

Моя реакция кишки (и некоторые простые тесты) показывают, что это абсолютно безопасно, но я не смог найти документацию в любом месте, где можно полностью убедить меня.

ответ

6

Безопасно, да. Исполнитель, нет, в этом ограниченном примере, по крайней мере. Помните, что одна строка кэша не может быть в двух ядрах одновременно. Вы заставите ядро ​​A ждать, пока ядро ​​B будет записываться в буфер, а затем подождите, пока память будет передана, а затем напишите на него. Копирование многоядерных копий должно быть очень большим, чтобы избежать этого эффекта.

+0

Это зависит от процессора, если память была объявлена ​​изменчивой, и уровня оптимизации компилятора. Как правило, каждое ядро ​​будет записывать в свою собственную копию кеша, которую процессор будет решать позже во время последующего сброса. Это приводит к тому, что реальный барьер синхронизации памяти полностью необходим, чтобы получить детерминированное поведение из-за того, что он действительно пытался прочитать записанную память. –

+2

x86/x64 и многие другие процессоры являются кеш-когерентными (http://en.wikipedia.org/wiki/Cache_coherency). Два ядра могут содержать одну и ту же строку кэша, и обе копии всегда будут обновляться, чтобы они сохраняли одно и то же значение. Конечно, как и сказано, доступ к одной и той же линии кэширования из двух ядер оказывает огромное влияние на производительность. – Timo

+0

@ Адам: К счастью, меня беспокоит только письмо - любые чтения будут происходить далеко в будущем. В противном случае я, вероятно, был бы еще более параноидальным. – JaredC

2

До тех пор, пока каждый экземпляр memcpy полагает, что он записывает только его часть буфера, он полностью безопасен. Распределение массивов любой формы на C++ очень низкоуровневое; это непрерывный блок хранения, выделенный в соответствующем размере для программы, а массив как объект, который существует как нечто иное, кроме указателя, просто иллюзия. Дайте memcpy неперекрывающиеся диапазоны массива, и он не знает, что они не просто два полностью отдельных массива, которые просто оказываются соседними друг с другом. Писания не будут мешать.

+0

MemCpy? Больше похоже на memcpy. Более того, OP обеспокоен проблемами одновременного доступа к памяти из разных потоков. –

+0

Ваше тактичное и вежливое редактирование копии оценено в духе сотрудничества, в котором оно было предложено. Во всяком случае, OP обеспокоен проблемами одновременного доступа к неперекрывающимся смежным областям памяти в разных потоках, на что я ответил. –

4

Да, это полностью безопасно, сериализация доступа к шине памяти выполняется в аппаратном обеспечении.

0

Да, это абсолютно не связано с любым случаем - перед заказом. его простое копирование байтов.

Смежные вопросы