2012-05-18 5 views
2

cl_mem 버퍼에 저장되어있는 긴 문자열을 커널에 제출합니다.OpenCL의 문자열 조각 내기

이 긴 문자열을 개별 문자열로 나눠서 일부 일치 처리를위한 검색 패턴으로 사용하려고합니다.

어떻게하면됩니까?

__kernel void SetHorspoolMatch(
       __global const char *haystack, 
       __global const char *needlesData){} 

needlesData을 여러 개의 "바늘"로 나누고 싶습니다.

또는 호스트에서 커널로 문자열 배열을 이동하여 개별적으로 사용하는 더 좋은 방법이 있습니까?

+0

needlesData는 haystack에서 검색 할 단일 하위 문자열입니까? 당신 needlesData의 모든 사건, 그냥 첫 번째 사건, 또는 얼마나 많은가의 개수를 찾으려고 노력하고 있습니까? – mfa

+1

커널에 데이터를 제출하기 전에 호스트에서 데이터를 분할하는 것이 좋습니다. – vocaro

+0

커널을 사용하여 데이터를 전달하는 것이 좋지 않습니다. 일반적인 방법을 기반으로 일부 재주문 순서를 바꾸려는 경우가 아니면 호스트 측에서 처리하는 것이 좋습니다. – DarkZeros

답변

1

저는 이것을 CUDA와 함께했습니다. 4M 파일을 처리하고 766K 토큰으로 분할하려면 NVidia GTX 560 카드 (336 CUDA 코어, 메모리 대역폭 128G 바이트/s)에서 ~ 40ms가 걸립니다. 공유 (로컬) 메모리 또는 상수 메모리를 사용하는 최적화가 없습니다.

문자열이 토큰 문자와 토큰이 아닌 문자로 구성된다고 가정 해 봅시다. 기본 기술은 각 문자를 병렬로 조사합니다.

각 스레드 (작업 항목)는 인접한 2 개의 문자를 찾습니다. 최초의 char가 비 토큰이고 두 번째의 char가 토큰 인 경우 그런 다음 토큰의 시작을 발견했습니다. 해당 스레드는 토큰의 끝이나 문자열의 끝을 찾을 때까지 앞으로 스캔 할 수 있습니다. 길이가 1이고 문자열의 첫 번째 문자를 탐색하는 특수 사례 문자열이 필요합니다 (이전 구분 기호는 없습니다). 다른 모든 조합은 거부 할 수 있습니다.

출력은 두 개의 배열입니다. 첫 번째는 시작 위치입니다. 두 번째 배열은 길이입니다. 출력 배열에 쓰는 것은 배열에서 다음 사용 가능한 위치를 계산하는 원자 추가에 의해 제어됩니다. 이 카운터는 출력 매개 변수로도 반환됩니다.

경과 시간의 95 %가 토큰 검색에 소비됩니다. 호스트 GPU 메모리 전송에 5 %가 소비됩니다.

+0

__constant__ 메모리에서 256 바이트 룩업 테이블을 사용하여 구분 기호에 대한 테스트를 최적화하면 성능이 100 % –