2014-11-17 6 views
1

큰 2D 배열 (C 언어)을 장치에 전달하고 가능한 모든 조합을 결정합니다. 예 :CUDA - 알 수없는 크기의 결과를 반환하는 방법

A = 
id val1 val2 
1 100 200 
2 400 800 

Combination = 
id1 id2 sumval1 sumval2 
1 2 500  1000 

원래 배열의 크기 때문에 가능한 모든 조합을 저장하고 반환 할 수 없습니다. sumval1> 500 및 sumval2> 1000 인 모든 조합을 반환하고 싶습니다.

어떻게이 조합의 조합 만 파일에 기록 할 호스트로 되돌릴 수 있습니까? 얼마나 많은 조합이 조건을 충족시키는 지 모르겠다.

답변

0

당신은 페이지 수있는 결과 :

  • 이 수정 결과 배열을 생성 (의는 Z 항목을 가정 해 봅시다).

  • 결과뿐만 아니라 중단 한 지점 (last_id1, last_id2)도 반환하십시오.

  • 다음 호출시 마지막 결과에 따라 새 시작점 (start_id1, start_id2)을 전달하십시오.

GPU를로드하기 위해 스트림을 사용할 수 있습니다.

이렇게하면 여러 GPU를 사용하여 계산을 배포 할 수도 있습니다.

+0

저는 페이징 아이디어를 좋아합니다. 나는 결과를 위해 배열 R을 할당 할 것이지만 배열을 어떻게 색인화해야합니까? C에서는 결과가 입력 될 때마다 ++가됩니다. 동일한 스레드를 사용하는 모든 스레드에서 문제가 발생합니까? – user2936659

+0

스트림 압축을 수행하고 thrust :: remove_if를 살펴보아야합니다. 출력 배열에 맞는 수만큼 조합을 생성하십시오. 어쩌면 입력이 텍스처가되어야 할 수도 있으므로, 출력에 복사하지 않고 술어의 값을 사용할 수 있습니다. 스트림 압축을 실행하고 last_id1과 lastid_2를 리턴하십시오. 데이터를 진행하면서 다른 시작점을 사용하여 여러 번 커널을 호출하십시오. – purpletentacle

3

몇 가지 가능한 접근 방법 :

  1. 이 (호스트에서) 할당은 버퍼를 GPU 메모리에 남아있는 어떤 공간. 이를 초과하면 어쨌든 모든 전송을 단일 전송으로 다시 전달할 수 없습니다. (mtk99에서 제안한 솔루션을 사용할 수 있습니다).
  2. 커널에있는 malloc을 사용하여 장치에서 필요에 따라 동적으로 공간을 할당하십시오. 조합 생성이 완료되면 모든 개별 조합을 malloc으로 만든 단일 버퍼로 수집하십시오. 그런 다음이 버퍼의 전체 크기와이 버퍼에 대한 포인터를 호스트로 다시 전달합니다. 그런 다음 호스트는 cudaMalloc을 사용하여 해당 크기의 새 버퍼를 할당하고 커널을 실행하여 malloc으로 만든 버퍼에서 cudaMalloc으로 만든 버퍼로 데이터를 복사합니다. 이 복사 커널이 완료되면 호스트는 cudaMalloc으로 작성된 버퍼에서 데이터를 호스트로 다시 전송할 수 있습니다.

나는 당신이하려고하는 것에 대해 다른 것을 모른 채로 아마도 최선의 접근이라고 제안 할 것입니다. 커널에서 malloc은 많은 수의 작은 할당을 할당 할 때 특히 빠르지 않습니다. 또한, 커널 내 malloc을 사용하는 경우 증가시킬 수있는 기본 크기 제한 (8MB)에 유의하십시오.

+0

나는 페이징 아이디어를 좋아한다.나는 결과를 위해 배열 R을 할당 할 것이지만 배열을 어떻게 색인화해야합니까? C에서는 결과가 입력 될 때마다 ++가됩니다. 동일한 스레드를 사용하는 모든 스레드에서 문제가 발생합니까? – user2936659

+0

예, 단일 버퍼를 업데이트하려고하는 여러 스레드가있는 경우 문제가 발생합니다. 내 대답은 [here] (http://stackoverflow.com/questions/21786495/cuda-kernel-returning-vectors/21788662#21788662) 여러 개의 스레드가 단일 버퍼에 데이터를 푸시하는 데 유용 할 수 있습니다. –

관련 문제