2009-06-10 3 views
0

일부 하드웨어 (하드웨어 자체는 중요하지 않음)로 작업하고 있으며 일부 블록 데이터를 별도의 조각으로 나누어 빠르게 실행해야합니다.데이터의 고속 인터리빙

예를 들어 연속적인 메모리 블록 X 단어가 있습니다. 블록 2

블록 (Block)

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

: 나는 네 개의 개별 블록으로 이러한 분할의 빠른 방법이 필요

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 ... 

: 시각화를 위해, 나는 아래 50 개 워드 라인으로 배열하고있어

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

블록 3

기본적으로
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 ... 

지금이 일이-루프를 사용하는 것만 큼 간단합니다. 그러나 이것을 더 최적화/병렬화하는 방법은 무엇입니까? (MPI가 없어도 데스크톱에서 실행되는 앱에서 발생합니다.)

그래서 단지 명확하게하기 위해, 그것을 합산 : 위의 그림과 같이

  1. 내가 데이터를 가지고있다.

  2. 이 데이터를 여러 기기 (PC 외부)로 보냈습니다. 이 데이터는 별도의 장치로 4 개의 개별 블록으로 와이어 아래로 보내야합니다.

답변

1

같은 것을 (당신이 쓰기에 대해 걱정하지 않아도 가정) 당신을 도울 수 있어요. 데이터 셔플 링은 물론 메모리 및 스트리밍 데이터를 매우 잘 처리합니다. x86이 아닌 일부 아키텍처에서는 유사한 ISA 확장을 사용할 수 있습니다 (예 : AltiVec)

+0

리소스/링크/책이 ​​시작 되었습니까? – moogs

+0

인텔의 x86 설명서 제 1 권 9 장은 논리적 인 것 같습니다. – MSalters

0

EDIT : 데이터를 외부 인터페이스로 전달하는 것처럼 들립니다. 이것이 기가비트 이더넷 인터페이스만큼 느린 것이라면 병목 현상은 유선 상태 일 것이고 데이터 작성 속도는 아닙니다. 코드를 편리하게 처리 할 수있는 방식으로 블록을 작성하기 위해 데이터를 반복하면됩니다.


아마도 오프셋/스트라이드 표기법을 사용하여 주변 블록을 전달해야합니다. 기본적으로 각 블록은 시작 주소, 첫 번째 요소가 나타나는 블록, 요소 사이의 바이트 수 및 행 사이의 바이트 수로 설명됩니다. 그래서, 뭔가 같은 :

 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 

그래서 당신이 병렬로 데이터를 일할 수있는이 곳 SSE 좋은 예이다이

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); 
    } 
+0

감사합니다! 이 응용 프로그램 내부 블록을 조작하기위한 괜찮습니다. 하드웨어에 전달되면 좋지 않습니다. litle 리소스를 갖는 하드웨어는 각 블록에 대해 연속적인 데이터를 필요로합니다. – moogs

+0

기가비트 이더넷이 느립니까? – moogs

+0

아니, 그다지 느리지는 않지만, 프로세서가 먹이를 지킬 수있을 정도로 충분히 빠른 인터커넥트가 있습니다. 그들은 기가비트 이더넷보다 훨씬 빠릅니다. PCI-Express, Myranet, FibreChannel의 일부 품종이 모두이 예입니다. 이 경우 – SingleNegationElimination

관련 문제