Aquí está mi código:

struct S {
    int a, b;
    float c, d;
};
class A {
private:
    S* d;
    S h[3];
public:
    A() {
        cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3));
    }
void Init();
};

void A::Init() {
    for (int i=0;i<3;i++) {
        h[i].a = 0;
        h[i].b = 1;
        h[i].c = 2;
        h[i].d = 3;
    }
    cutilSafeCall(cudaMemcpy(d, h, 3*sizeof(S), cudaMemcpyHostToDevice));
}

A a;

De hecho es un programa complejo que contienen CUDA y OpenGL. Cuando me depuración de este programa, se produce un error cuando se ejecuta en cudaMemcpy con la información de error

cudaSafeCall() en tiempo de ejecución error de API 11: argumento no válido.

De hecho, este programa se transforma de otro que se puede ejecutar correctamente. Pero en que uno, he utilizado dos variables S* d e S h[3] en la función principal en lugar de en la clase. Lo que es más raro es que puedo implementar esta clase en un pequeño programa, que funciona bien.
Y he actualizado mi conductor, todavía hay un error.

Podría alguien darme una pista de por qué sucede esto y cómo solucionarlo. Gracias.

  • Por cierto, el cudaMemcpy se reture cudaErrorInvalidValue.
  • Dónde está la línea A a;? Es dentro de una función, o es global? Si es global, entonces el constructor podría ser llamado antes de que usted tiene un dispositivo válido contexto (no estoy seguro acerca de esto, pero es posible). Si ese es el caso, entonces el d puntero pasa a cudaMemcpy no sería válida.
  • Puede publicar su CUDA configuración que uso, por favor? Yo no puedo reproducir el error con una vieja GeForce 9400m y CUDA 5.0 de vista previa.
InformationsquelleAutor TonyLic | 2012-05-14

1 Comentario

  1. 3

    Debido a que las operaciones de memoria en CUDA están bloqueando, hacen un punto de sincronización. Para otros errores, si no se comprueba con cudaThreadSynchonize, se parece como errores en la memoria de llamadas.

    Así que si se recibe un error en una operación de la memoria, trate de colocar una cudaThreadSynchronize antes y comprobar el resultado.


    Asegúrese de que la primera malloc declaración está siendo ejecutado. Si es un problema acerca de la inicialización de CUDA, como @Harrism indicar, entonces se produciría un error en esta frase?? Trate de colocar printf declaraciones, y adecuadas de los inicializaciones se realiza. Creo que en general no válido argumento de errores se generan por el uso de uninitalized áreas de memoria.

    1. Escribir un printf para el constructor que muestra la dirección de la cudaMalloc ed área de memoria

      A()
      {
          d = NULL;
          cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3));
          printf("D: %p\n", d);
      }
    2. Intentar hacer una copia de la memoria de una zona local asignado, es decir, mover el cudaMalloc a por encima de cudaMemcopy (sólo para pruebas).

      void A::Init()
      {
          for (int i=0;i<3;i++)
          {
              h[i].a = 0;
              h[i].b = 1;
              h[i].c = 2;
              h[i].d = 3;
          }
          cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3)); //here!..
          cutilSafeCall(cudaMemcpy(d, h, 3*sizeof(S), cudaMemcpyHostToDevice));
      }

    Buena suerte.

Dejar respuesta

Please enter your comment!
Please enter your name here