можно ли получить доступ к HBM2 параллельно?
У меня есть код, который обращается к ~4 ГБ памяти последовательно, он обращается к 1024 битам на запрос, случайным образом по всем 4 ГБ... У меня есть RADEON VII с 16 ГБ HBM2 с 4096-битной шиной.
Возможная оптимизация 1: 4 ГБ и 4x данных на запрос памяти! (не работает, потому что первый запрос сообщает мне второй запрос через эти 4 ГБ, поэтому необходимые данные для второго запроса могут быть далеко в памяти)
Возможная оптимизация 2: 4+4+4+4 ГБ и 1x данных на запрос памяти! (не улучшает производительность, потому что каждый запрос к группе 4 ГБ задерживает другие до производительности 0,25x, поэтому я получаю 4 потока с производительностью 0,25x каждый)
Вопросов:
Для оптимизации 1. Можно ли разделить 4096-битную шину, чтобы я мог извлекать разные области 1024-битной памяти параллельно неблокирующим способом?
Для оптимизации 2 - можно ли адресовать "блоки" по 4 ГБ параллельно таким образом, чтобы каждый блок был независимым и не блокировал другие?
PS - Я знаю, что это зависит от контроллера памяти, поэтому, если вы знаете другое оборудование, которое может это сделать, сообщите мне тоже.
1 ответ
можно ли получить доступ к HBM2 параллельно?
Да, доступ к HBM2 всегда осуществляется параллельно, но это не зависит от вас.
Обе предложенные вами оптимизации не работают. OpenCL не дает вам контроля над тем, как использовать шину памяти или где выделять память; это зависит от водителей. Если вы выделяете 4 ГБ, эти 4 ГБ не выделяются только на одном из 4 кристаллов памяти HBM2, а вместо этого автоматически распределяются по всем 4 кристаллам, чтобы максимизировать пропускную способность.
Лучшее, что вы можете сделать, - это убедиться, что у вас есть объединенный доступ к памяти (массив структур данных), и насытить графический процессор целыми рабочими элементами / рабочими группами. Radeon VII (я тоже использую их для своих вещей) имеет теоретическую пропускную способность 1024 ГБ / с, но на практике не ожидайте больше 800 ГБ / с.