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

Bibliothèques Discussion :

[instrinsics] Visual C++ 2010 problème d'execution


Sujet :

Bibliothèques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut [instrinsics] Visual C++ 2010 problème d'execution
    Bonsoir

    j'ai entendu parlé de cette magie d'exécuté des opérations mathématique simultanément par un seul thread hier. Aujourd'hui, je me suis donc mis à instrinsics. J'ai pu compilé sous mac os (64 bits) avec Xcode et gcc, et cela fonctionnait parfaitement. Mais l'ordi le plus puissant que je dispose tourne sous windows 7 32bit sur un intel i7 930. Dans visual c++ expresse 2010, la librairie de instrinsics est dans les Includes, du moin ... Le fichier xmmintrin.h existe.

    Je compile donc ... aucune érreur !

    Seulement, l'execution plante.

    Voici donc le code compilé :
    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
     
    #include "stdio.h"
     
    #include <xmmintrin.h>
     
     
     
     
     void add (const float *a, const float *b, float * c)
    {
    	__m128 t0, t1;
     
    	t0 = _mm_load_ps (a);
    	t1 = _mm_load_ps (b);
     
    	t0 = _mm_add_ps (t0, t1);
     
    	_mm_store_ps (c, t0);
    }
     
     
    int main (int argc, char * argv[])
    {
     
    	const float a[] = { 2.0f,2.0f,2.0f ,2.0f };
    	const float b[] = { 1.0f,2.0f,3.0f ,4.0f };
    	float c[4] ;
     
    	add (a, b, c);
     
    	for(int i = 0; i < 4; i++)
    		printf("Resultat %d = %.2f\n", i, c[i]);
     
     
    	return 0;
    }
    Pouvez vous m'aider à ce que cela fonctionne ?
    Merci de votre lecture ainsi que de vos réponse éventuel.

  2. #2
    Invité
    Invité(e)
    Par défaut
    http://msdn.microsoft.com/en-us/libr...8VS.80%29.aspx

    The address must be 16-byte aligned.
    Du coup essaye déjà _mm_loadu_ps.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Et bien non, cela ne fonctionne pas

    j'ai comme retour, une message box avec :
    Exception non gérée à 0x00b0b6a4 dans ComparaisonCalcul.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xffffffff.
    que se soit avec _mm_load_ps ou _mm_loadu_ps

  4. #4
    Membre confirmé
    Profil pro
    Ingénieur consultant
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur consultant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par défaut
    Effectivement les données doivent être "16 bytes aligned"

    Pour faire cela tu dois un peu changer ton main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main (int argc, char * argv[])
    {
     
    	__declspec(align(16)) const float a[] = { 2.0f,2.0f,2.0f ,2.0f };
    	__declspec(align(16)) const float b[] = { 1.0f,2.0f,3.0f ,4.0f };
    	__declspec(align(16)) float c[4] ;
     
    	add (a, b, c);
     
    ...
    }
    __declspec(align(16)) est une directive du compilateur permettant d'aligner tes tableaux de float sur un multiple 16 octets, le reste devrait donc marcher. Je ne suis pas très sur si le const doit être avant ou après le decspec.

    NB: Pour l'allocation dynamique utilise: _aligned_malloc et _aligned_free

Discussions similaires

  1. [Débutant] Visual studio 2010 - Gestion d'executables externes
    Par nomadev dans le forum Visual Studio
    Réponses: 2
    Dernier message: 19/09/2013, 11h59
  2. [Visual C++ 2010] Problème pour linker une librairie
    Par CleeM dans le forum Visual C++
    Réponses: 9
    Dernier message: 30/08/2012, 16h22
  3. Réponses: 18
    Dernier message: 25/11/2011, 21h50
  4. Rapport .rdlc Visual Studio 2010, problème affichage image png
    Par tomtom3471 dans le forum Visual Studio
    Réponses: 0
    Dernier message: 15/09/2011, 18h00
  5. Réponses: 16
    Dernier message: 06/01/2010, 16h17

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