Estoy encontrando un «sin especificar el lanzamiento de» error al ejecutar mi programa en Cuda .
He comprobado los errores .

El programa es un solucionador de ecuación diferencial . Se repite TOTAL_ITER veces .
ROOM_X ans ROOM_Y son la anchura y la altura de las matrices .

Aquí es el encabezado, su nombre es «único :

#define ITER_BETWEEN_SAVES 10000
#define TOTAL_ITER 10000
#define ROOM_X 2048
#define ROOM_Y 2048
#define SOURCE_DIM_X 200
#define SOURCE_DIM_Y 1000
#define ALPHA 1.11e-4
#define DELTA_T 10
#define H 0.1
#include <stdio.h>

void Matrix(float* M);
void SolverCPU(float* M1, float* M2);
__global__ void SolverGPU(float* M1, float* M2);

Aquí está el núcleo y una función que llene una matriz :

#include "solver.h"
#include<cuda.h>

void Matrix(float* M)
{
  for (int j = 0; j < SOURCE_DIM_Y; ++j) {
    for (int i = 0; i <  SOURCE_DIM_X; ++i) {
    M[(i+(ROOM_X/2 - SOURCE_DIM_X/2)) + ROOM_X * (j+(ROOM_Y/2 - SOURCE_DIM_Y/2))] = 100;
    }
  }
}

    __global__ void SolverGPU(float* M1,float *M2)  {
   int i =threadIdx.x + blockIdx.x * blockDim.x;
       int j = threadIdx.y + blockIdx.y * blockDim.y;

        float M1_Index = M1[i + ROOM_X * j];
        float M1_IndexUp = M1[i+1 + ROOM_X * j];
        float M1_IndexDown =M1[i-1 + ROOM_X * j];
        float M1_IndexLeft = M1[i + ROOM_X * (j+1)];
        float M1_IndexRight = M1[i + ROOM_X *(j-1)];


        M2[i + ROOM_X * j] = M1_Index + (ALPHA * DELTA_T / (H*H)) * (M1_IndexUp + M1_IndexDown + M1_IndexLeft +M1_IndexRight - 4*M1_Index);     

}

Y aquí está el principal

int main(int argc, char* argv[] ){
float *M1_h, *M1_d,*M2_h, *M2_d;
int size = ROOM_X * ROOM_Y * sizeof(float);
cudaError_t err = cudaSuccess;  
//Allocating Memories on Host
M1_h = (float *)malloc(size);
M2_h = (float *)malloc(size);
//Allocating Memories on Host
err=cudaMalloc((void**)&M1_d, size);
if (err != cudaSuccess) { 
fprintf(stderr, "Failed to allocate array_d ... %s .\n", cudaGetErrorString(err)); 
exit(EXIT_FAILURE); 
}
err=cudaMalloc((void**)&M2_d, size);    
if (err != cudaSuccess) { 
fprintf(stderr, "Failed to allocate array_d ... %s .\n", cudaGetErrorString(err)); 
exit(EXIT_FAILURE); 
}
//Filling the Matrix
Matrix(M1_h);
//Copy on Device
err = cudaMemcpy(M1_d, M1_h, size, cudaMemcpyHostToDevice);
if(err !=0){
printf("%s-%d\n",cudaGetErrorString(err),1);
getchar();  
}
err=cudaMemcpy(M2_d, M2_h, size, cudaMemcpyHostToDevice);
if(err !=0){
printf("%s-%d",cudaGetErrorString(err),2);
getchar();  
}
dim3 dimGrid(64,64);
dim3 dimBlock(32,32);
//SolverGPU<< <threadsPerBlock, numBlocks >> >(M1_d,M2_d);
for(int i=0;i<TOTAL_ITER;i++) { 
if (i%2==0) 
SolverGPU<< <dimGrid,dimBlock >> >(M1_d,M2_d);
else
SolverGPU<< <dimGrid,dimBlock >> >(M2_d,M1_d);
}   
err=cudaMemcpy(M1_h, M1_d, size, cudaMemcpyDeviceToHost);
if(err !=0){
printf("%s-%d",cudaGetErrorString(err),3);
getchar();  
}   
cudaFree(M1_d);
cudaFree(M2_d);
free(M1_h);
free(M2_h);
return 0;   
}

No hay ningún problema en la compilación .

Whne puedo comprobar mis errores, los «sin especificar el lanzamiento de error» aparece en la memcpy DESPUÉS de que el núcleo .

Aceptar, por lo que he leído que es por lo general debido a que el kernel que no se ejecuten correctamente . Pero no puedo encontrar el error (s) en el kernel … supongo que el error es bastante simple , pero no puede entender a encontrar .

  • Un «¿por qué no un trabajo» pregunta con uncompilable código es una completa pérdida de tiempo de todos. Voto a cerrar.
  • gracias por su amable respuesta ! 🙂 De hecho se me olvidó poner una función para eliminar algunas líneas de código . Realmente lo siento por eso . He editado mi post . Espero que compile ahora .
  • Cómo alguien podría ser capaz de compilar sin saber lo que ROOM_X es, por ejemplo? por LO que espera de MCVE. Debe ser un código completo. Si quieres probar si has escrito correctamente la pregunta, para iniciar un nuevo proyecto vacío, y copia el código de la pregunta que se han publicado, sin añadir nada ni cambiar nada (que es, después de todo, de lo que otros van a hacer). A continuación, ver si se puede compilar. Si no se puede, tu pregunta/MCVE es incompleta.
  • Yo lo hice . Gracias por la explicación . Supongo que podría haber encontrado por mí mismo, supongo que estoy un poco cansado .x) Ahora bien, este código debe compilar .
InformationsquelleAutor Ptit Sualty | 2014-12-03

1 Comentario

  1. 46

    Al compilar y ejecutar el código, me sale:

    an illegal memory access was encountered-3

    impreso.

    Puede ser, de hecho, llegar «sin especificar el lanzamiento de fracaso» en su lugar. El error exacto informes dependerá de la versión CUDA, la GPU y de la plataforma. Pero podemos seguir adelante sin importar.

    Ya sea mensaje indica que el kernel puso en marcha, pero se ha encontrado un error, por lo que no se pudo completar correctamente. Puede depurar el kernel de los problemas de ejecución mediante un depurador, tales como cuda-gdb en linux, o Nsight VSE en windows. Pero no necesitamos sacar el depurador todavía.

    Una herramienta útil es cuda-memcheck. Si ejecutamos el programa con cuda-memcheck, obtenemos algunos resultados adicionales que indica que el kernel está haciendo no válido global lee de tamaño 4. Esto significa que están haciendo un fuera de los límites de acceso a la memoria. Podemos obtener una mayor claridad si queremos volver a compilar el código añadiendo el -lineinfo cambiar y, a continuación, vuelva a ejecutar el código con cuda-memcheck. Ahora podemos obtener una salida parecida a esta:

    $ nvcc -arch=sm_20 -lineinfo -o t615 t615.cu
    $ cuda-memcheck ./t615 |more
    ========= CUDA-MEMCHECK
    ========= Invalid __global__ read of size 4
    =========     at 0x00000070 in /home/bob/misc/t615.cu:34:SolverGPU(float*, float*)
    =========     by thread (31,0,0) in block (3,0,0)
    =========     Address 0x4024fe1fc is out of bounds
    =========     Saved host backtrace up to driver entry point at kernel launch time
    =========     Host Frame:/usr/lib64/libcuda.so.1 (cuLaunchKernel + 0x2cd) [0x150a7d]
    =========     Host Frame:./t615 [0x11ef8]
    =========     Host Frame:./t615 [0x3b143]
    =========     Host Frame:./t615 [0x297d]
    =========     Host Frame:./t615 (__gxx_personality_v0 + 0x378) [0x26a0]
    =========     Host Frame:./t615 (__gxx_personality_v0 + 0x397) [0x26bf]
    =========     Host Frame:./t615 [0x2889]
    =========     Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xf4) [0x1d994]
    =========     Host Frame:./t615 (__gxx_personality_v0 + 0x111) [0x2439]
    =========
    --More--

    (y hay mucho más de salida de error)

    Esto significa que el primer error encontrado por su núcleo era un inválido lectura global de tamaño 4 (es decir, un fuera de los límites de acceso tratando de leer un int o float cantidad, por ejemplo). Con el lineinfo información, podemos ver que esto ocurrió:

    =========     at 0x00000070 in /home/bob/misc/t615.cu:34:SolverGPU(float*, float*)

    es decir, en la línea 34 en el archivo. Esta línea pasa a ser esta línea de código del kernel:

        float M1_IndexRight = M1[i + ROOM_X *(j-1)];

    podemos depurar más, tal vez usando el kernel printf declaraciones a descubrir dónde está el problema. Pero ya tenemos una idea de que estamos indexación fuera de los límites, así que vamos a inspeccionar la indización:

      i + ROOM_X *(j-1)

    ¿qué evaluar este cuando i=0 y j=0 (es decir. para el hilo (0,0) en 2D hilo de la matriz)? Se evalúa a -2048 (es decir, –ROOM_X), que es un ilegal índice. Tratando de leer desde M1[-2048] creará un fallo.

    Tienes un montón de complicadas indexación pasando en su núcleo, así que estoy bastante seguro de que hay otros errores así. Usted puede utilizar un método similar a la pista de abajo (tal vez usando printf a escupir la calculados los índices, o más pruebas de los índices de validez).

Dejar respuesta

Please enter your comment!
Please enter your name here