2008-11-14 5 views
5

은 내가 특별한 플래그없이 cubin 파일로 컴파일 있어요 CUDA 커널을 괴롭히는 :CUDA 메모리는

nvcc text.cu -cubin 

이 메시지와 함께하지만 그것은, 컴파일 :

권고 : 말할 수 없다 어떤 포인터가 가리키고, 전역 메모리 공간이 있다고 가정하십시오.

그리고 임시 cpp 파일의 라인에 대한 참조. 나는 나에게 이해가되지 않는 겉으로보기에 임의의 코드를 주석 처리함으로써 이것을 작동시킬 수있다.

__global__ void string_search(char** texts, int* lengths, char* symbol, int* matches, int symbolLength) 
{ 
    int localMatches = 0; 
    int blockId = blockIdx.x + blockIdx.y * gridDim.x; 
    int threadId = threadIdx.x + threadIdx.y * blockDim.x; 
    int blockThreads = blockDim.x * blockDim.y; 

    __shared__ int localMatchCounts[32]; 

    bool breaking = false; 
    for(int i = 0; i < (lengths[blockId] - (symbolLength - 1)); i += blockThreads) 
    { 
     if(texts[blockId][i] == symbol[0]) 
     { 
      for(int j = 1; j < symbolLength; j++) 
      { 
       if(texts[blockId][i + j] != symbol[j]) 
       { 
        breaking = true; 
        break; 
       } 
      } 
      if (breaking) continue; 
      localMatches++; 
     } 
    } 

    localMatchCounts[threadId] = localMatches; 

    __syncthreads(); 

    if(threadId == 0) 
    { 
     int sum = 0; 
     for(int i = 0; i < 32; i++) 
     { 
      sum += localMatchCounts[i]; 
     } 
     matches[blockId] = sum; 
    } 
} 

을 나는이 줄

localMatchCounts[threadId] = 5; 

이없는 사항으로 컴파일과 선을 루프의 첫 번째 후

localMatchCounts[threadId] = localMatches; 

를 교체하는 경우 다음과 같이

커널입니다. 이것은 라인 위의 루프의 무작위 부분을 주석 처리하여 얻을 수도 있습니다. 나는 또한 아무런 효과가없는 정상적인 배열로 로컬 메모리 어레이를 교체하려고 시도했다. 아무도 내게 문제가 무엇인지 말할 수 있습니까?

시스템은 Vista 64 비트이며, 그 가치는 무엇입니까?

편집 : 실제로 컴파일러 알림을 생성하지만 실제로 작동하도록 코드가 수정되었습니다. 적어도 정확성 (성능에 영향을 미칠 수 있음)과 관련하여 경고가 문제가되는 것처럼 보이지 않습니다.

답변

1

배열은 **, 커널에 문제가있다.
는 단일 연속 버퍼를 할당하고, 병렬 액세스를 가능하게하는 방식으로 분할하는 것이 좋다.

경우 : I가 제 배열 내의 각 스트링의 오프셋과의 길이를 포함하는 1 차원 서로 다른 1D 배열 하나씩 위치하는 모든 문자열을 포함 배열, 크기 2 * numberOfStrings를 정의하려는 이때
예 - 커널 준비 :

 
char* buffer = st[0] + st[1] + st[2] + ....; 
int* metadata = new int[numberOfStrings * 2]; 
int lastpos = 0; 
for (int cnt = 0; cnt < 2* numberOfStrings; cnt+=2) 
{ 
    metadata[cnt] = lastpos; 
    lastpos += length(st[cnt]); 
    metadata[cnt] = length(st[cnt]); 
} 
커널에서 :
 
currentIndex = threadId + blockId * numberOfBlocks; 
char* currentString = buffer + metadata[2 * currentIndex]; 
int currentStringLength = metadata[2 * currentIndex + 1]; 

0

문제는 문자 ** 매개 변수와 관련이있는 것으로 보인다. 이를 char *로 바꾸면 경고 메시지가 나오므로이 데이터 형식에 문제가있을 수 있습니다. 아마도 cuda는이 경우 특정 cuda 2D 배열을 사용하는 것을 선호합니다. 커널 호스트의 메모리에 액세스 할 수 없기 때문에 문자와 같은 포인터의