Быстрое чередование данных - PullRequest
0 голосов
/ 10 июня 2009

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

Итак, у меня есть, например, непрерывный блок памяти длиной X слов. Для наглядности я разбил его на 50 строк ниже:

001  002  003  004  005 006 007 ...
051  052  053  054  055 056 057 ...
101  102  103  104  105 106 107 ...
151  152  153  154  155 156 157 ...

Мне нужен быстрый способ разбить их на четыре отдельных блока:

block1

001  003  005 007 ...
101  103  105 107 ...

block2

002  004  006 ...
102  104  106 ...

Block3

051  053  055 057 ...
151  153  155 157 ...

Block4

052  054  056 ...
152  154  156 ...

Или, в основном:

Block1   Block2   Block1   Block2 ...
Block3   Block4   Block3   Block4 ...
Block1   Block2   Block1   Block2 ...
Block3   Block4   Block3   Block4 ...

Теперь сделать это так же просто, как использовать циклы for. Но что является более оптимизированным / параллельным способом сделать это? (Нет MPI, это происходит в приложении, работающем на рабочем столе).

Подводя итог, просто для ясности:

  1. У меня есть данные, как показано выше.

  2. Я отправляю эти данные нескольким устройствам (вне ПК). Эти данные должны быть отправлены по проводам в виде 4 отдельных блоков (на отдельные устройства).

Ответы [ 2 ]

1 голос
/ 10 июня 2009

Это яркий пример, когда SSE может вам помочь. Это очень хорошо для перетасовки данных, а также потоковой передачи данных из памяти и обратно. В некоторых архитектурах, отличных от x86, доступны аналогичные расширения ISA (например, AltiVec)

0 голосов
/ 10 июня 2009

РЕДАКТИРОВАТЬ: Похоже, вы передаете данные на внешний интерфейс. Если это что-то такое же медленное, как гигабитный интерфейс Ethernet, узкое место будет в сети, а не то, как быстро вы сможете составлять данные. Просто переберите данные, чтобы построить свои блоки любым удобным для вашего кода способом.


Возможно, вы хотите передать блоки, используя нотацию смещения / шага. По сути, каждый блок описывается от его начального адреса до блока, в котором появляется первый элемент, количества байтов между элементами и количества байтов между строками. Итак, что-то вроде:

       Block
         1    2    3    4
base     0    0    50   50
first    0    1    0    1
offset   2    2    2    2
stride   100  100  100  100

Таким образом, вы можете работать с данными параллельно (при условии, что вам не нужно беспокоиться о записи) примерно так

struct Block {
    int base;
    int first;
    int offset;
    int stride;
    int cols; rows;
};

/* given some reasonable block[n] and buffer */

for ( int row = 0; col < block[n].rows; ++row)
    for (int col = 0; row < block[n].cols; ++col)
    {
        int cell = buffer[
                      block[n].base + 
                      block[n].first +
                      row*block[n].stride + 
                      col*block[n].offset]
        doSomething(cell);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...