2017-08-11 3 views
-1

Je suis en train de convertir du code existant qui peut être optimisé en utilisant des instructions SIMD. Il y a un code de génération de masque que je suis en train de tester combien de performance je peux sortir de SIMD après la conversion et le dessous est un morceau simplifié que j'utilise pour le profiler.System.Numerics.Vector.GreaterThan et les résultats booléens

Random r = new Random(); 
var random1 = new double[65536000*4]; 
var random2 = new double[random1.Length]; 
var result = new bool[random1.Length]; 
for (i = 0; i < random1.Length; i++) 
{ 
    random1[i] = r.Next(); 
    random2[i] = r.Next(); 
} 

var longRes = new long[random1.Length]; 
for (int i = 0; i < result.Length; i += Vector<double>.Count) 
{ 
    Vector<double> v1 = new Vector<double>(random1, i); 
    Vector<double> v2 = new Vector<double>(random2, i); 
    Vector<long> res = System.Numerics.Vector.GreaterThan(v1, v2); 
    res.CopyTo(longRes, i); 
} 

Y at-il une technique que je pourrais utiliser pour mettre efficacement le résultat res dans le tableau result?

MISE À JOUR 1

Au départ, je pensais que je pouvais vivre avec Vector<long> et garder les masques en long[] mais j'ai réalisé que peut-être cela est impossible.

+0

Vous ne voulez pas * vraiment * longtemps []? Vous devez normalement utiliser ConditionalSelect() en regard du résultat de la comparaison pour générer un nouveau vecteur. Attention à l'utilisation gratuite de Parallel.For(), la classe Random n'est pas thread-safe. –

+0

@HansPassant Oui, j'ai réalisé après avoir publié ceci que le 'Vector ' était destiné à 'ConditionalSelect()' et je veux probablement l'utiliser à la place. J'ai un code de masquage manuel que je devrais convertir, cependant. Je pense à des façons de ne pas divulguer ce détail d'implémentation pour les couches supérieures de la base de code ... Peut-être que je devrais introduire une sorte de wrapper ... Et merci pour la sécurité des threads "Random", Je me suis également rendu compte après l'affichage que les tableaux contenaient beaucoup de 0 à cause de cela ... –

+0

Y a-t-il un quelconque intérêt à garder cette question quand vous connaissez toutes ces choses après quelques instants? Cela ne fait que gaspiller le temps des gens, s'il vous plaît supprimez-le. –

Répondre

0

Comme commenté sur la question originale, je suis venu à la réalisation que System.Numberics.Vector.GreaterThan et d'autres méthodes similaires comme LesserThan etc sont conçus pour une utilisation avec ConditionalSelect(). Dans mon cas, j'essayais de générer un tableau bool qui représente un masque d'image utilisé par la suite dans l'API et la conversion de long en bool n'est pas faisable. En d'autres termes, ces méthodes de comparaison n'étaient pas destinées à un usage général.