Algorithm 数据的快速交织

Algorithm 数据的快速交织,algorithm,parallel-processing,Algorithm,Parallel Processing,我正在使用一些硬件(硬件本身并不重要),我需要将一些块数据分割成单独的部分,以便让它运行得更快 例如,我有一个连续的内存块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 ... 我需要一种快速的方法将它们分成

我正在使用一些硬件(硬件本身并不重要),我需要将一些块数据分割成单独的部分,以便让它运行得更快

例如,我有一个连续的内存块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 ...
我需要一种快速的方法将它们分成四个独立的块:

区块1

001  003  005 007 ...
101  103  105 107 ...
区块2

002  004  006 ...
102  104  106 ...
区块3

051  053  055 057 ...
151  153  155 157 ...
区块4

052  054  056 ...
152  154  156 ...
或者,基本上:

Block1   Block2   Block1   Block2 ...
Block3   Block4   Block3   Block4 ...
Block1   Block2   Block1   Block2 ...
Block3   Block4   Block3   Block4 ...
现在这样做就像使用for循环一样简单。但是什么是更优化/并行的方法呢?(没有MPI内容,这发生在桌面上运行的应用程序上)

总结一下,我想说清楚:

  • 我有如上所示的数据

  • 我将此数据发送到多个设备(PC之外)。这些数据需要作为4个单独的块(到单独的设备)沿线路发送


  • 编辑:听起来像是将数据传递到外部接口。如果这与千兆位以太网接口一样慢,那么瓶颈将出现在线路上,而不是您合成数据的速度。只需在数据上进行迭代,就可以以任何对代码来说方便的方式构建块


    也许您要做的是使用偏移/步幅符号传递块。从本质上讲,每个块都是从它的起始地址、第一个元素出现的块、元素之间的字节数和行之间的字节数来描述的。比如说:

           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);
        }
    
    struct块{
    int-base;
    int优先;
    整数偏移量;
    步幅;
    int列;行;
    };
    /*给定一些合理的块[n]和缓冲区*/
    对于(int row=0;col
    这是SSE可以帮助您的一个主要示例。它非常擅长数据洗牌,以及从内存和返回的数据流。在某些非x86体系结构上,有类似的ISA扩展可用(例如AltiVec)

    谢谢!这对于操作应用程序内部的块很好。但是当它被传递到硬件时就不好了。硬件拥有少量资源,需要每个块的连续数据。不,速度不是很慢,但有足够快的互连,处理器很难保持它们的供电。它们都比千兆以太网快得多。PCI Express、Myranet和各种光纤通道都是这样的例子。在这种情况下,以太网远远不是瓶颈。谢谢。有资源/链接/书籍开始吗?