2012-03-17 8 views
0

길이가 최대 500자인 문자열과 크기가 200MB 인 텍스트 파일이 있습니다. CUDA에서 텍스트 파일의 문자열을 검색하는 프로그램을 작성하고 싶습니다. 내 텍스트 파일이 너무 커서 장치의 전역 메모리에 저장해야한다고 생각하지만 내 문자열은 어떻게됩니까? 공유되고 일정하며 질감있는 메모리 중에서 가장 좋은 점은 무엇입니까? 그리고 왜? 또한 배열의 최대 크기는 2500입니다. 장치 메모리를 저장하는 데 적합한 유형은 무엇입니까?CUDA - 텍스트에서 문자열 검색

+1

문자열을 공유 메모리에 직접 저장할 수는 없으며 공유 메모리는 커널을 실행하는 동안 실행중인 각 블록의 스레드에만 채울 수 있습니다. 소스 메모리는 전역, 상수 또는 텍스처 메모리 여야합니다. – talonmies

+0

CUDA에 대해 배우려면이 글을 쓰는 것이 좋습니다. 그러나 CPU 구현에 비해 성능이 크게 향상 될 것으로 기대할 수 있다고 생각하지 않습니다. 적어도 일반적이고 순진한 구현에서는 그렇지 않습니다. 그러나 텍스트 검색은 다양한 방법으로 최적화 될 수 있습니다. 좋은 출발점은 http://en.wikipedia.org/wiki/String_searching_algorithm입니다. –

답변

0

하프 - 워프의 모든 스레드가 검색 문자열의 동일한 요소에 동시에 액세스 할 수 있도록 커널을 작성한다고 가정하면 상수 메모리가 좋은 결과를 얻을 수 있습니다. 이 경우에 최적화되어 있습니다.

여기 루프는 각 스레드가 검색 문자열의 다른 요소에 액세스하도록 구성되어있는 경우 간단한 기본 구현

...load blocksize+strlen bytes of the file into shared memory... 
__syncthreads(); 
bool found = true; 
for (int i = 0; i < strlen; i++) { 
    if (file_chunk_in_sharedmem[threadIdx.x + i] != 
     search_str_in_constantmem[i]) 
    { 
     found = false; 
     break; 
    } 
} 
if (found) { 
    ...output the result... 
} 

에 대한 몇 가지 의사 코드입니다, 1D 텍스처 메모리가 더 빠를 수 있습니다.

프로파일 러 및/또는 타이밍 타이밍 기능은 친구입니다. 페르미의 원래 구현을 위해

1

:

스토어 글로벌 메모리에 텍스트 파일 및 상수 메모리에 검색 문자열. 텍스트 파일과 같은 크기의 결과 버퍼를 설정하십시오. 결과 버퍼를 0으로 채 웁니다.

블록 당 스레드 수를 t으로하고 검색 문자열의 길이와 같게합시다. 눈금 차원을 결정하려면 텍스트 파일의 크기와 눈금 차원 한계 인 64K를 고려하십시오. 전체 파일을 포함하려면 x의 크기 (예 : 10K)를 선택하십시오. 그런 다음 텍스트 파일의 크기를 x으로 나눈 다음 결과를 반올림하여 y의 크기를 찾으십시오. 따라서 200M/10K = 20K (64K 이내)입니다. t 스레드 및 (x, y) 그리드로 커널을 시작하십시오. 커널

는 :

는 D =X + 1024 * Y 같이 텍스트 파일 오프셋을 계산한다.

y 차원이 반올림되었으므로 실행 종료시 일부 커널을 중단해야합니다. d + t이 텍스트 파일의 크기보다 큰 경우 스레드를 중단합니다. 그렇지

, 검색 문자열에서 인덱스 t에서 스레드로드 한 문자를 가지고 텍스트 파일의 인덱스 + D에 하나 개의 문자를 비교합니다. 문자가 일치하지 않으면 결과 버퍼에 d의 "1"을 저장하고 그렇지 않으면 아무 것도 수행하지 않습니다.

커널이 완료되면 결과 버퍼를 Thrust로 스캔하십시오. 0 인 각 위치는 일치 항목의 시작 지점입니다.