길이가 최대 500자인 문자열과 크기가 200MB 인 텍스트 파일이 있습니다. CUDA에서 텍스트 파일의 문자열을 검색하는 프로그램을 작성하고 싶습니다. 내 텍스트 파일이 너무 커서 장치의 전역 메모리에 저장해야한다고 생각하지만 내 문자열은 어떻게됩니까? 공유되고 일정하며 질감있는 메모리 중에서 가장 좋은 점은 무엇입니까? 그리고 왜? 또한 배열의 최대 크기는 2500입니다. 장치 메모리를 저장하는 데 적합한 유형은 무엇입니까?CUDA - 텍스트에서 문자열 검색
답변
하프 - 워프의 모든 스레드가 검색 문자열의 동일한 요소에 동시에 액세스 할 수 있도록 커널을 작성한다고 가정하면 상수 메모리가 좋은 결과를 얻을 수 있습니다. 이 경우에 최적화되어 있습니다.
여기 루프는 각 스레드가 검색 문자열의 다른 요소에 액세스하도록 구성되어있는 경우 간단한 기본 구현
...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 텍스처 메모리가 더 빠를 수 있습니다.
프로파일 러 및/또는 타이밍 타이밍 기능은 친구입니다. 페르미의 원래 구현을 위해
:
스토어 글로벌 메모리에 텍스트 파일 및 상수 메모리에 검색 문자열. 텍스트 파일과 같은 크기의 결과 버퍼를 설정하십시오. 결과 버퍼를 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 인 각 위치는 일치 항목의 시작 지점입니다.
- 1. 구분 된 텍스트에서 문자열 검색
- 2. CUDA 바이너리 검색 구현
- 3. 검색 작업을위한 cuda 라이브러리
- 4. 텍스트에서 문자열 데이터 추출 C++
- 5. 텍스트에서 문자열 유형을 제거 하시겠습니까?
- 6. CUDA/OpenCL에서 깊이 우선 검색
- 7. 정규 표현식을 사용하여 텍스트에서 문자열 가져 오기
- 8. 여러 텍스트에서 가장 긴 문자열 찾기
- 9. 텍스트에서 항목을 선택하는 MySql 문자열 조작
- 10. 문자열 텍스트에서 URL을 찾는 좋은 방법은 무엇입니까?
- 11. 문자열 검색 문자열 목록
- 12. 하위 문자열 검색 문자열
- 13. 강조 문자열 검색 문자열
- 14. 주어진 검색 텍스트에서 키워드 강조 표시
- 15. 검색 문자열
- 16. 문자열 검색
- 17. 문자열 검색
- 18. 검색 문자열
- 19. C#의 텍스트에서 검색 문자열의 컨텍스트 가져 오기
- 20. 문자열 내에서 검색 기능 문자열
- 21. 문자열 내부에서 부분 문자열 검색
- 22. PHP : 문자열 내의 문자열 검색
- 23. 검색 문자열, 다음 행 검색
- 24. 자바에서 텍스트 파일을 단일 단위로 표현하고 텍스트에서 일치하는 문자열
- 25. cuda
- 26. URL을 텍스트에서 제거하는 방법
- 27. 텍스트에서 문자열을 제거하려면 어떻게해야합니까?
- 28. 텍스트에서 JSON 추출
- 29. DirectoryInfo에서 문자열 검색
- 30. 문자열 조작, 텍스트 검색
문자열을 공유 메모리에 직접 저장할 수는 없으며 공유 메모리는 커널을 실행하는 동안 실행중인 각 블록의 스레드에만 채울 수 있습니다. 소스 메모리는 전역, 상수 또는 텍스처 메모리 여야합니다. – talonmies
CUDA에 대해 배우려면이 글을 쓰는 것이 좋습니다. 그러나 CPU 구현에 비해 성능이 크게 향상 될 것으로 기대할 수 있다고 생각하지 않습니다. 적어도 일반적이고 순진한 구현에서는 그렇지 않습니다. 그러나 텍스트 검색은 다양한 방법으로 최적화 될 수 있습니다. 좋은 출발점은 http://en.wikipedia.org/wiki/String_searching_algorithm입니다. –