Мне было поручено написать программу, которая выполняет потоковую передачу векторов в разбросанные области памяти с максимально возможной максимальной скоростью.Входные данные - это идентификатор пункта назначения и векторы с плавающей запятой XYZ, поэтому что-то вроде:
[198, {0.4,0,1}], [775, {0.25,0.8,0}], [12, {0.5,0.5,0.02}]
, и мне нужно сложить их в память следующим образом:
memory[198] += {0.4,0,1}
memory[775] += {0.25,0.8,0}
memory[12] += {0.5,0.5,0.02}
Чтобы усложнить ситуацию,будет несколько потоков, делающих это одновременно, читающих из разных входных потоков, но суммирующих в одну и ту же память.Я не ожидаю, что будет много разногласий по поводу одних и тех же областей памяти, но они будут.Наборы данных будут довольно большими - несколько потоков по 10 ГБ каждый, которые мы будем передавать одновременно с нескольких SSD, чтобы получить максимально возможную пропускную способность чтения.Я предполагаю SSE для математики, хотя это, конечно, не должно быть так.
Результаты не будут использоваться какое-то время, поэтому мне не нужно загрязнять кеш ...но я суммирую в памяти, а не просто пишу, поэтому я не могу использовать что-то вроде MOVNTPS, верно?Но так как потоки не будут слишком сильно наступать друг на друга, как я могу сделать это без лишних блокировок?Вы бы сделали это с ограждением памяти?
Спасибо за любую помощь.Я могу предположить Nehalem и выше, если это имеет значение.