오버랩이있을 수있는 단일 입력 배열에서 블록 단위 공유 메모리 영역을 할당하는 쉬운 방법이 있습니까?CUDA : 테두리가 겹치는 공유 메모리 할당
간단한 예제는 문자열 검색입니다. 보았습니다. 입력 텍스트를 다듬어보고 각 블록의 각 스레드가 text [thread_id]에서 시작하는 패턴을 검색하도록하고 각 블록에 할당 된 데이터를 패턴 길이만큼 겹쳐서 경계를 넘는 일치하는 사례를 아직도 발견. 각 블록에 공유 메모리에 할당 된 총 메모리 크기 즉
은 아마 간단한 뭔가를 놓치고과 CUDA 가이드를 통해 현재 다이빙 생각 해요
(blocksize+patternlength)*sizeof(char)
이지만, 몇 가지 지침을 부탁드립니다.
업데이트 : 일부 사람들은 내 질문에 대해 오해하고 있거나 (내가 잘못 설명 했음) 의심 스럽습니다.
데이터 세트 QWERTYUIOP이 있다고 가정 해 봅시다. 3 문자 일치를 검색하려고합니다. 각 스레드 블록에 대해 데이터 세트를 임의로 4로 잘라냅니다. QWER TYUI OPxx
이것은 수행하기에 충분히 간단하지만 실제로 3 문자가 일치하면 IOP를 찾는 알고리즘이 실패합니다. 이 경우
가, 내가 원하는 것은 각 블록은 공유 메모리에 가지고입니다 :QWERTY TYUIOP OPxxxx
즉, 각 블록은 그래서 메모리 국경 문제가 발생하지 않는 블록 크기 + patternlength-1 문자를 할당됩니다 .
더 나은 것을 설명하는 희망.
@jmilloy은 ... 지속되고 있기 때문에 : 대신 나는 짓을하고 싶은 무엇
//VERSION 1: Simple
__global__ void gpuSearchSimple(char *T, int lenT, char *P, int lenP, int *pFound)
{
int startIndex = blockDim.x*blockIdx.x + threadIdx.x;
int fMatch = 1;
for (int i=0; i < lenP; i++)
{
if (T[startIndex+i] != P[i]) fMatch = 0;
}
if (fMatch) atomicMin(pFound, startIndex);
}
//VERSION 2: Texture
__global__ void gpuSearchTexture(int lenT, int lenP, int *pFound)
{
int startIndex = blockDim.x*blockIdx.x + threadIdx.x;
int fMatch = 1;
for (int i=0; i < lenP; i++)
{
if (tex1Dfetch(texT,startIndex+i) != tex1Dfetch(texP,i)) fMatch = 0;
}
if (fMatch) atomicMin(pFound, startIndex);
}
//Version 3: Shared
__global__ void gpuSearchTexSha(int lenT, int lenP, int *pFound)
{
extern __shared__ char shaP[];
for (int i=0;threadIdx.x+i<lenP; i+=blockDim.x){
shaP[threadIdx.x+i]= tex1Dfetch(texP,threadIdx.x+i);
}
__syncthreads();
//At this point shaP is populated with the pattern
int startIndex = blockDim.x*blockIdx.x + threadIdx.x;
// only continue if an earlier instance hasn't already been found
int fMatch = 1;
for (int i=0; i < lenP; i++)
{
if (tex1Dfetch(texT,startIndex+i) != shaP[i]) fMatch = 0;
}
if (fMatch) atomicMin(pFound, startIndex);
}
질문의 나머지 부분에서 설명 된 바와 같이, 공유 메모리 덩어리로 텍스트를 넣어하는 것입니다 P, 이후 버전의 텍스쳐 메모리에 텍스트를 유지합니다.
hmmm 이것은 내가 당신이 의미한다고 생각했던 것입니다. 당신이 내 대답에 대해 당신에게 잘못한 것이 무엇인지 설명한다면 도움이 될 것입니다. – jmilloy
또한 두 가지 질문이 있습니다. '블록화'란 무엇입니까? 'text'는 무엇입니까 ('text [thread_id]'에서와 같이)? – jmilloy