Мне было поручено написать программу, которая выполняет потоковую передачу сумм векторов в разбросанные области памяти с максимально возможной скоростью. Входные данные - это идентификатор пункта назначения и векторы с плавающей запятой 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+ ГБ каждый, которые мы будем транслировать одновременно с нескольких твердотельных накопителей, чтобы получить максимально возможную пропускную способность чтения. Я предполагаю SSE для математики, хотя это, конечно, не должно быть так.
Результаты какое-то время не будут использоваться, поэтому мне не нужно засорять кеш... но я суммирую в память, а не просто записываю, так что я не могу использовать что-то вроде MOVNTPS, верно? Но поскольку потоки не будут сильно наступать друг на друга, как я могу сделать это без больших затрат на блокировку? Вы бы сделали это с ограждением памяти?
Спасибо за любую помощь. Я могу предположить Nehalem и выше, если это имеет значение.