que tienen un núcleo CUDA, que estoy compilar en un archivo cubin sin ningún tipo de marcas especiales:memoria CUDA preocupa
nvcc text.cu -cubin
Compila, aunque con este mensaje:
Asesor: No se puede decir a lo que apunta el puntero, asumiendo el espacio de memoria global
y una referencia a una línea en algún archivo cpp temporal. Puedo hacer que esto funcione al comentar un código aparentemente arbitrario que no tiene sentido para mí.
El núcleo es el siguiente:
__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;
}
}
Si se sustituye la línea de
localMatchCounts[threadId] = localMatches;
después del primer bucle con esta línea
localMatchCounts[threadId] = 5;
compila sin avisos. Esto también se puede lograr comentando partes aparentemente aleatorias del ciclo por encima de la línea. También intenté reemplazar la matriz de memoria local con una matriz normal sin ningún efecto. Alguien puede decirme cuál es el problema?
El sistema es Vista 64bit, por lo que vale la pena.
Editar: He corregido el código por lo que realmente funciona, aunque todavía produce el aviso del compilador. No parece que la advertencia sea un problema, al menos con respecto a la corrección (podría afectar el rendimiento).