IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCL Discussion :

Kernel OpenCL ne fonctionne qu'une seule fois


Sujet :

OpenCL

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 12
    Points
    12
    Par défaut Kernel OpenCL ne fonctionne qu'une seule fois
    Salut tout le monde,

    Je bute sur un problème avec mon (très simple) kernel OpenCL : il semble fonctionner comme je le désire la première fois que j'exécute le programme host mais les fois suivantes, il ne se comporte plus comme il le devrait et je n'arrive pas à comprendre ce qui cloche avec le code, j'espère que quelqu'un sera en mesure de m'aider !

    Voilà le code host :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    int SomeClass::someFunction() {
     
    	cl_int err = CL_SUCCESS;
    	try {
     
    		vector<cl::Platform> platforms;
    		cl::Platform::get(&platforms);
    		if (platforms.size() == 0) {
    			cout << "Platform size 0\n";
    			return -1;
    		}
     
    		cl_context_properties properties[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};
    		cl::Context context(CL_DEVICE_TYPE_CPU, properties); 
     
    		vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
     
    		cout << "Max compute units : " << devices[0].getInfo<CL_DEVICE_MAX_COMPUTE_UNITS>() << endl;
     
    		cl::Program::Sources source;
     
    		ifstream inputFile("kernel.cl");
    		string *prog = new string(istreambuf_iterator<char>(inputFile),(istreambuf_iterator<char>()));
    		source.push_back(make_pair(prog->c_str(), prog->length()));
     
    		cl::Program program_ = cl::Program(context, source);
    		program_.build(devices);
     
    		cl::Kernel kernel(program_, "SimpleKernel", &err);
     
    		int tab[10] = {0};
    		cl::Buffer buffer(context, CL_MEM_READ_WRITE|CL_MEM_USE_HOST_PTR, size_t(10), tab);
     
    		kernel.setArg(0,buffer);
     
    		cl::Event event;
    		cl::CommandQueue queue(context, devices[0], 0, &err);
     
    		queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(8), cl::NDRange(2), NULL, &event); 
     
    		event.wait();
     
    		for (int i=0 ; i<10 ; i++)
    			cout << endl << tab[i];
    		cout << endl;
    	}
    	catch (cl::Error err) {
    		cerr << "ERROR: " << err.what() << "(" << err.err() << ")" << endl;
    	}
     
    	return EXIT_SUCCESS;
    }
    et le code kernel (kernel.cl) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    __kernel void SimpleKernel(__global int *output) {
    	output[get_global_id(0)] = get_global_id(0);
    	printf("%d %d\n", get_local_id(0), get_global_id(0));
    }
    Mon but était de remplir un tableau d'int appelé "tab" à l'aide de la fonction get_global_id() : la taille du tableau est 10 et il est initialisé avec des 0.
    Après l'exécution du kernel, tab devrait ressembler à ceci : tab[0] = 0, tab[1] = 1, tab[2] = 2, etc... et ÇA MARCHE mais seulement la première fois que j'exécute le programme.
    Quand je printf le tableau, j'obtiens quelque chose comme "0 1 2 3 4 5 6 7 0 0" mais ensuite, quand je recommence je n'obtiens plus que "0 0 0 0 0 0 0 0 0 0" (comme si le kernel ne s'était pas exécuté) et il faut que je redémarre l'ordinateur pour qu'il fonctionne à nouveau (une seule fois).

    Je n'arrive pas à comprendre ce qui cloche, si quelqu'un peut m'aider, hallelujah parce que ça commence à me rendre fou !

    Merci d'avance.

    Foin

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Points : 228
    Points
    228
    Par défaut
    A ta place je croirais pas ce que sort un printf dans un kernel OpenCL, les accès mémoires peuvent-être bizarres.
    Copie plutôt ton tableau sorti, et compare à ce que tu attends dans le code C++.

  3. #3
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Vérifie la pertinence de ton appel au noyau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(8), cl::NDRange(2), NULL, &event);
    Il me semble que le range n'est pas bon. Tu as un tableau de 10 par 1 et pas de 8 par 2.

Discussions similaires

  1. pourquoi on error goto ne fonctionne qu'une seule fois ?
    Par alsimbad dans le forum Général VBA
    Réponses: 9
    Dernier message: 05/09/2014, 12h09
  2. Survol ne fonctionne qu'une seule fois sur IE
    Par elekaj34 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/08/2009, 14h06
  3. [JSTL] foreach qui ne fonctionne qu'une seule fois
    Par Ouguiya dans le forum Taglibs
    Réponses: 16
    Dernier message: 02/08/2007, 16h17
  4. Réponses: 6
    Dernier message: 13/07/2007, 11h46
  5. [AJAX] [XMLHttp][IE]Fonction qui ne fonctionne qu'une seule fois
    Par narnou dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/07/2007, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo