2012-06-12 4 views
0

나는 1 백만 열 x 100 만 행의 행렬을 가지고 있습니다.gpgpu를 사용하여 많은 수의 벡터 계산을 수행하는 가장 좋은 방법은 무엇입니까?

내 알고리즘으로는 할 필요가 :

Matrix m = Matrix(rows,cols) 
for (colB: cols){ 
    vector currColA = m.getcolumn(colA) 

    for (colB: cols){ 
    vector currColB = m.getcolumn(colB) 
    result = currColA.dotProduct(colB) 
    return result; 
}} 

또는 당신은 또한 말할 수 :

Vectors [] v = Vectors[] 

for (i: v.length){ 
    vector v1 = v[i] 

    for (i: v.length){ 
    vector v2 = v[i] 
    result = v1.dotProduct(v2) 
    return result; 
}} 

내 질문 : 메모리를 할당에 대한 메모리를 초기화 할 수있는 적절한 방법을 무엇 이 문제는

입니다. 전체 행렬에 메모리를 할당하고, 전체 행렬로 초기화해야합니까? 그 다음에 알 고를 실행합니까?
- 또는 벡터 목록에 메모리를 할당하고이 목록을 반복해야합니까?
- 그렇지 않으면 ??

내 관심사는 GPP 로의 전송 시간을 최소화하고 싶습니다. 나는 2 개의 벡터에서 sgemm 연산을 위해 JCublas hello world example을 수정하여 이런 종류의 계산을 시도했지만, 많은 수의 벡터에서 처리 할 때 gpu 가속의 이점을 삭제하는 전송 시간을 갖게되었다.

Thx! 추 신 : 구현은 모든 Java 라이브러리에있을 수 있습니다.

+0

이것이 희박한 매트릭스입니까? 32 비트 정수 또는 부동 소수점 값의 1 백만 x 1 백만 밀집도 행렬에는 4000GB의 메모리가 필요합니다. GPU 메모리에 맞지 않을뿐만 아니라 전용 데이터 센터가 필요없는 호스트 시스템의 메모리에 맞지 않습니다. 어떤 종류의 기계에서이 작업을 할 계획입니까? – talonmies

+0

@talonmies 나는 double 값의 250,000 스파 스 벡터 배열을 사용합니다. 벡터의 길이는 1,100,000입니다. (http://code.google.com/p/matrix-toolkits-java/source/browse/trunk/src/no/uib/cipr/matrix/sparse/SparseVector.java?r=46).벡터는 매우 희소합니다 (평균 10 개의 값이 채워짐). 지금은 랩톱에서 i7-2860, 16Gb로 멀티 스레딩을 실행할 수 있지만 몇 시간이 걸립니다. – seinecle

답변

0

한 번에 한 번씩 제한하는 것처럼 들립니다. CPU-> GPU 복사, 대기, 계산, GPU-> CPU 복사, 대기. 대부분의 사람들은 메모리 복사본으로 인해 발생할 수있는 암시 적 대기를 인식하지 못합니다.

작업을 파이프 라인 처리 할 수 ​​있습니까? 즉, 루프가 다음과 같이 구성되어 있습니까?

  • CPU-> GPU 복사
  • GPU 컴퓨팅
  • 위해 GPU> CPU 복사

파이프 라인이 당신이 4 별도의 (순서대로) 명령 큐 (예를 들어)를 사용하는 것, 문제 각 대기열에서 GPU로 논 블로킹 전송, 각 대기열에서 커널 실행을 실행하고 각 대기열에서 GPU -> CPU 사본을 순서대로 실행합니다. 두 버퍼가 대기 상태가 될 때까지 유효하게 유지해야합니다 (나중에 설명). 이렇게하면 후속 메모리 전송이 진행되는 동안 GPU가 계산을 시작할 수 있습니다.

또한 블로킹 메모리 전송을 사용하지 말고 항상 비 블로킹을 사용하십시오. 많은 (8?) 전송마다 GPU-> CPU 복사를위한 이벤트 객체를 얻습니다. 그러나 첫 번째 반복이 아닌 경우 마지막 이벤트 객체를 먼저 기다립니다. 이렇게하면 대기열이 스로틀되어 버퍼를 다시 사용할 수 있지만 작업을 겹치면 전송이 유지되고 겹쳐서 계산됩니다. 우리는 이전에 8 번의 반복 전송을 기다리고 있으므로 대기열을 배출하지 않습니다. 대기열 깊이를 관리하는 것이 중요하며 과도한 작업 항목으로 인해 느린 GUI 및 작업 항목 기아가 발생합니다.