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 :

Optimisation : qualificateurs Static, Private, Local, Global pour des variables


Sujet :

OpenCL

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut Optimisation : qualificateurs Static, Private, Local, Global pour des variables
    Bonjour,


    Je viens récemment de me mettre à OpenCL et j'essaye d'optimiser un de mes code.
    Je suis cependant un peu perdu avec les variables static/private/locale/globales.
    Je crois qu'il y a quelques optimisation contre-intuitives du compilateur qui me perdent un peu.


    De manière générale, j'ai 4 variables en buffer global, 1 pour les résultats (write-only), et 3 pour les inputs (read-only):
    • A: 1 unique pour tous les threads (const int [32]);
    • B: 1 différente pour chaque threads (4 600 threads * const float [32]);
    • C: 1 unique pour tous les threads de longueur variable (K * const float [32*32]) // pour le moment K < 20, à terme K potentiellement très grand (2^32);


    Je sais que de manière générale, avoir ces variables dans le buffer global me plombe mes performances.

    A est quelque peu troublant. J'obtiens les meilleures performances lorsque je le laisse dans le buffer global. Si je l'écris en dur dans le code de mon kernel (+17% en temps d'exécution), ou si j'essaye de le fetch en private avant usage, mes performances se dégradent. Ce qui est très troublant.

    En revanche, pour B, j'ai gagné en performance en le fetchant en private avant usage.
    Pour C, je ne gagne pas en performances si je le fetch en private avant usage (avec K=1).


    Pour fetcher en private, je fait un bête parcours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int A_priv[32];
    for(int i = 0; i < 32; ++i)
        A_priv[i] = A[i].

    Je pensais les fetcher en local avant usage, mais je me demande si j'aurais réellement un gain vu que je ne fais pas d'écriture sur ces variables :
    • A : j'ai l'impression que le compilateur optimise, l'utilisation est très rapide, même si j'utilise les valeurs plusieurs fois ;
    • B : unique pour chaque thread, je les récupère en private ;
    • C : petit (32*32) à très gros (K*32*32), le même pour tous les threads, je me demande s'il serait sage de le récupérer en local / ses valeurs ne sont utilisées qu'une seule fois chacunes.



    Est-ce que vous auriez donc des conseils/best practices sur l'utilisation des buffers locaux ?
    Est-ce que vous auriez une idée sur la raison pour laquelle pour A, un buffer global est plus performant que les valeurs écrites en dur dans le kernel, ou de le fetcher en private alors que je l'utilise plusieurs fois ?


    Quelques informations sur ma configuration:
    Using platform: Intel Gen OCL Driver
    Using device: Intel(R) HD Graphics Skylake ULT GT2
    Beignet: "unable to find good values for local_work_size[i], please provide\n" " local_work_size[] explicitly, you can find good values with\n" "
    trial-and-error method."

    En vous remerciant d'avance pour vos réponses.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bon, en cherchant un peu sur mon chipset graphique :
    This "GT2" version of the Skylake GPU offers 24 Execution Units (EUs) clocked at up to 1050 MHz (depending on the CPU model).
    Due to its lack of dedicated graphics memory or eDRAM cache, the HD 520 has to access the main memory (2x 64bit DDR3L-1600 / DDR4-2133).
    Cela explique sûrement les performances très décevante que j'avais. Je vais tester sur un autre ordinateur.

Discussions similaires

  1. Compteur pour des variables manquantes
    Par MathildeLM dans le forum SAS Base
    Réponses: 1
    Dernier message: 25/04/2014, 13h21
  2. Syntaxe pour des variables nommées
    Par uraharasama dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 28/06/2010, 19h18
  3. Format pour des variables caractères
    Par CélineM dans le forum SAS Base
    Réponses: 9
    Dernier message: 13/05/2008, 17h34
  4. Opérations simple pour des variables
    Par anayathefirst dans le forum Jasper
    Réponses: 8
    Dernier message: 31/03/2008, 11h57
  5. Réponses: 3
    Dernier message: 19/12/2005, 13h39

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