Я разрабатываю инфраструктуру совместной обработки CPU-FPGA, поэтому мне нужен полный контроль над выравниванием моих данных.У меня есть структура данных, которая требует только 5 байтов:
typedef struct __attribute__ ((packed)) {
uint32_t dst;
uint8_t weight;
} edg_t;
Мой интерфейс FPGA может читать со скоростью 1 кэш-строку (64 байта) за цикл (200 миллионов операций чтения в секунду).Для моей производительности крайне важно, чтобы я поместил как можно больше элементов в одну строку кэша, поэтому о заполнении структуры не может быть и речи.
5 байт: 12 элементов / чтение
8 байт: 8 элементов /read (padded)
padding -> снижение производительности в 1,5 раза
Однако у меня не может быть структуры, перекрывающей границу между строками кэша, которая требует, чтобы я строил логику на FPGA для постоянного сдвига считываемых данных.
Мое текущее решение при создании буфера выглядит следующим образом:
int num_elements = 1000;
int num_cachelines = num_elements / 12 + 1;
uint8_t* buffer = new uint8_t[num_cachelines * 64]
uint8_t* buf_ptr = buffer - 4;
for (int i = 0; i < num_elements; i++) {
if (i % 12 == 0) buf_ptr += 4; //skip the last 4 bytes of each cache-line
edg_t* edg_ptr = (edg_t*) buf_ptr;
edg_ptr->dst = i; //example, I have random generators here
edg_ptr->weight = i % 256;
buf_ptr++;
}
Теперь все было хорошо, когда FPGA выполняла всю работу самостоятельно, теперь я хочу, чтобы FPGA и CPU работалисотрудничать.это означает, что ЦПУ теперь должен также читать буфер.
Мне было интересно, существует ли лучший способ, чтобы компилятор автоматически обрабатывал заполнение, или мне придется каждый раз вручную пропускать байты, какЯ сделал в буфере создания кода выше?