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

C++ Discussion :

Améliorer l'algorithme de mon memcpy


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Améliorer l'algorithme de mon memcpy
    (Re-)bonjour !
    J'ai essayé de faire un memcpy (plus rapide) que le standard, seulement, il arrive qu'il ne se comporte pas correctement...
    Il est censé, lorsque les adresses sont alignées sur 32-bits, copier 32 bits d'un coup.

    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
    __inline
    void * mymemcpy(void * dst, void const * src, size_t len)
    {
        int	*lpDst = (int *)dst;
    	int IntDst = reinterpret_cast<int>(dst);
    	int const *lpSrc = (int const *)src;
    	uintptr_t IntSrc = reinterpret_cast<uintptr_t>(src);
     
    	if (!(IntSrc & 0xFFFFFFFC) && !(IntDst & 0xFFFFFFFC))
    	{
    		while (len >=4)
    		{
    			*lpDst++ = *lpSrc++;
    			len -= 4;
    		}
    	}
     
    	char *pcDst = (char *)lpDst;
    	char const *pcSrc = (char const *)lpSrc;
     
    	while (len--)
    	{
    		*pcDst++ = *pcSrc++;
    	}
     
    	return (dst);
    }
    Je ne comprends pas ce qu'il se passe, j'ai l'impression que, parfois, il ne copie que des 0.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 66
    Points
    66
    Par défaut
    je veux pas te décevoir, mais ça me parait pas possible de faire un memcpy plus rapide que le standard (sauf si ton compilo génére du code d'un autre age).

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Je vais donc préciser que la plateforme est de type ARM, et que j'ai n'ai pas moyen de connaître le code généré.
    Mais, a priori, quand ce memcpy fonctionne, il est déjà plus rapide (x2).
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  4. #4
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut
    Ton len est 4 fois trop grnad dans la boucle principale.

  5. #5
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Exact
    Et en plus, dans l'appel, j'avais fait mon boulet( un copier/coller de trop).
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 66
    Points
    66
    Par défaut
    Ton test d'alignement me parait un peu space aussi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (!(IntSrc & 0xFFFFFFFC) && !(IntDst & 0xFFFFFFFC))
    ce serait pas mieux avec ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (((IntSrc & 0x03)==0) && ((IntDst & 0x03)==0))
    d'ailleurs, je pense pas que ce soit utile de tester l'alignement dans ton cas.

  7. #7
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut
    Citation Envoyé par progfou
    Je vais donc préciser que la plateforme est de type ARM, et que j'ai n'ai pas moyen de connaître le code généré.
    Mais, a priori, quand ce memcpy fonctionne, il est déjà plus rapide (x2).
    D'où sors tu ce chiffre ?
    Je viens de jeter un coup d'oeil au memmove de VS2005. Il est extremement complet : utilisation de SSE2 (qu'est-ce donc ?) si c'est possible, alignement sur un DWORD (copier 32 bits par 32bits, t'inquiète ils y ont pensé), décalages si les alignements src/dest sont différents, utilisation d'instructions "rep movs", ...

    Après les résultats de comparaison vont grandement dépendre de la taille des données à copier. Sur de petits blocs, les différents tests vont prendre une part visible du temps de copie. Pour des copies plus importantes, je doute fort que tu puisses faire mieux.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 66
    Points
    66
    Par défaut
    C'est de l'ARM, donc pas de SSE2 ni de rep movs. Par contre, j'aimerais bien savoir aussi d'ou sort le x2? Et le code que t'as généré, est-ce que tu avais activé toutes les optims (en release)?

  9. #9
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Le x2, c'est la mesure sur mon code, c'est une moyenne, et c'est tout ce qui m'intéresse.
    Et puis, en lisant tout, tu aurais vu, Ulmo ce que PierroElMito a bien vu, que c'est un ARM.
    Tu me parles de memmove, je parle de memcpy...
    Evite, si possible, de me prendre pour un idiot.

    Bref, le code généré, c'est avec optimisations.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

Discussions similaires

  1. [D2009] Amélioration d'algorithme
    Par BuzzLeclaire dans le forum Langage
    Réponses: 14
    Dernier message: 21/06/2010, 00h03
  2. Recherche Equation ou Algorithme de mon Problème
    Par Quintoux dans le forum Mathématiques
    Réponses: 3
    Dernier message: 05/11/2009, 17h37
  3. Améliorer un algorithme de complexité quadratique
    Par 1tox dans le forum Mathématiques
    Réponses: 12
    Dernier message: 20/04/2009, 09h06
  4. Réponses: 1
    Dernier message: 16/07/2008, 17h32

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