2012-07-02 2 views
1

온라인 (스트리밍) 데이터가 포함 된 프로젝트를보고 있습니다. 나는 그 데이터의 슬라이딩 윈도우로 작업하고 싶다. 예를 들어, 내 벡터에 10 개의 값을 넣고 싶다고합시다. 11 번 값이 오면, 1 번 값을 떨어 뜨리고 모든 것을 옮기고 10 번 값을 11 번 자리에 놓고 싶습니다.추력의 벡터 전환

int n = 9; 
thrust::device_vector<float> val; 
val.resize(n+1,0); 

// Shift left 
for(int i=0; i != n-1; i++){ 
    val[i] = val[i+1]; 
} 

// add the new value to the last position 
val[n] = newValue; 

추력이 할 수있는 "빠른"방법이 있나요 :

긴 방법

는 다음과 같은 것입니까? 내가 바라는 프로젝트에는이 작업을 동시에 수행해야하는 약 500 개의 벡터가 있습니다.

감사합니다.

+2

[링 버퍼] (http://en.wikipedia.org/wiki/Ring_buffer)가 필요합니다. 이동할 필요가없고 카운터 하나와 고정 된 크기의 배열 만 필요합니다. –

+0

@Viktor. 그게 ** 정확하게 ** 필요한 것입니다 !! 완전한. 큰 문제는 추력 장치 벡터로이 작업을 수행 할 수 있는지입니다. 나는 버퍼/벡터를 GPU에 유지하는 것을 선호한다. 생각? – Noah

답변

2

내가 말했듯이 Ring buffer이 필요합니다. 이동할 필요가없고 카운터 하나와 고정 된 크기의 배열 만 필요합니다.

500 개의 링 버퍼를 어떻게 처리 할 수 ​​있는지 생각해 봅시다.

500 개 (512 개) 슬라이딩 창을 모두 GPU에서 처리하려는 경우 각 순간이 동일한 순간의 샘플 배열 인 하나의 큰 2D 텍스처로 패킹 할 수 있습니다.

각 벡터에 대해 새로운 샘플을 한 번에 가져 오는 경우 (한 번의 처리 단계에서 각 512 개의 버퍼에 대해 하나의 새 샘플을 의미 함)이 "링 ​​텍스처"(실린더와 같은)는 업데이트해야합니다 한 번 (각 단계마다 새로운 샘플 배열을 업로드하십시오.) 하나의 카운터 만 있으면됩니다.

+1

OP는 그가 요구하는 것을하기 위해 추력을 사용하는 데 도움을 원합니다. – harrism

+0

"결혼해서"추력하지는 못했지만 현재는 GPU를 코딩하는 유일한 방법입니다. – Noah

+0

나는 "최선의 복사 방법"은 가능한 경우 복사를 피하는 것임을 의미했습니다. 어떤 기술이 사용 되든 상관 없습니다. 하나의 카운터가 전체 배열 (또는 귀하의 경우 500)을 이동해야 할 필요보다 낫습니다. –

1

원하는 것은 단지 thrust::copy입니다. 값이 쓰여지기 전에 값을 읽었는지 보장 할 수 없으므로 병렬로 자리 이동을 할 수 없습니다.

int n = 9; 
thrust::device_vector<float> val_in(n); 
thrust::device_vector<float> val_out(n+1); 

thrust::copy(val_in.begin() + 1, val_in.end(), val_out.begin()); 

// add the new value to the last position 
val_out[n] = newValue; 
+0

제안 된 코드를 보내 주셔서 감사합니다. 그러나 각 시간 단계에서 val_in에서 val_out으로 복사하는 것이 과도한 것으로 보입니다. – Noah

+1

데이터를 실제로 이동하려면 루프를 복사해야합니다. 그리고 병렬 처리를 원한다면 올바르게 수행 할 수 없으므로 두 개의 버퍼가 필요합니다. 실제로 물리적으로 이동하지 않으려는 경우 Viktor에서 제시 한 카운터 기반 링 버퍼를 구현할 수 있지만이 카운터는 추력 코드 외부에 유지해야합니다. – harrism

2

이 문제는 아직 무료이지만 다른 라이브러리를 사용하는 것이 좋습니다. 나도 같은 추력 코드 벤치마킹

array val = array(window_width, num_vectors); 
val = shift(val, 0, 1); 
array newValue = array(1,num_vectors); 
val(span,end) = newValue; 

및 ArrayFire은 추력에 비해 10 배의 속도 향상에 대해 점점 다음과 같이 ArrayFire 코드의 4 개 라인에서, 당신은 모두 500 개 벡터를 할 수 있습니다.

단점은 ArrayFire가 오픈 소스가 아니지만 이런 종류의 문제에 여전히 무료라는 것입니다.

+0

만약 당신이 downvote 거 야, 적어도 조랑말 귀하의 이유. 내가 잘못 말한 것이 있습니까[email protected] 노아는 이미 그가 스러스트와 결혼하지 않았다고 말했다. –

+0

VERY VERY 재미있는 제안. 나는 밀어 붙이려하지 않았고, ArrayFire 라이브러리는 흥미로 웠습니다. 나는 오늘 밤에 이것에 대해 약간의 독서를 할 계획이다. 감사! – Noah