2010-07-15 26 views
7

Le tableau à trier contient environ un million de chaînes, chaque chaîne pouvant contenir jusqu'à un million de caractères.Existe-t-il un algorithme pour trier les tableaux de chaînes pour le GPU?

Je suis à la recherche de toute implémentation d'algorithme de tri pour GPU.

J'ai un bloc de données avec une taille d'environ 1 Mo et j'ai besoin de construire suffix array. Maintenant, vous pouvez voir comment il est possible d'avoir un million de chaînes à l'intérieur d'une très petite quantité de mémoire.

+0

'1M' caractères par string (avg '.5M'?),' 1M' chaînes, 2 octets/char (plus commun) donne: '.5 * 1 * 2 = 1TB' mémoire. Vous avez besoin de quelque chose de spécial pour cela (peut-être une base de données?), Car très peu de machines existent avec ce type de mémoire, sans parler de la mémoire GPU. http://blogs.technet.com/b/markrussinovich/archive/2008/07/21/3092070.aspx – Abel

+1

La longueur de chaîne maximale ne dit rien sur la moyenne. Je suppose que les chaînes sont déjà en mémoire et en cours de tri, mais l'affiche est mécontente des performances du processeur sur la tâche. –

+0

Il peut être pertinent/utile d'entendre comment les données sont structurées. Est-ce un tas de chaînes contiguës séparées par '\ 0'? Les chaînes sont-elles précédées d'un en-tête contenant un nombre d'octets? Ou y a-t-il un tableau de pointeurs dans un tas? Parlons-nous des chaînes ASCII ou Unicode? –

Répondre

3

L'état de l'art dans le tri des GPU n'est pas particulièrement encourageant. Pour le tri des entiers 32 bits, le document suivant de 2009 (avec 2 auteurs qui sont des chercheurs chez Nvidia) ne réclame que 23% d'augmentation pour le meilleur tri CUDA sur GTX280 par rapport au meilleur tri CPU sur un Yorkfield 4 cœurs.

http://www.mgarland.org/files/papers/gpusort-ipdps09.pdf

Cette utilisé une sorte de base sur le GPU, et le tri par fusion sur le processeur. Vous auriez besoin d'un tri basé sur la comparaison pour construire un tableau de suffixes, donc au lieu de trier la base GPU, le meilleur de ceux dans le papier serait le tri par fusion GPU, qui a atteint environ la moitié de la vitesse du type GPU. clés) - c'est-à-dire environ 40% plus lent que le tri par fusion du processeur. L'ajout de clés de longueur variable risque d'entraîner une désynchronisation des threads dans un GPU, ce qui réduirait davantage les performances du GPU que du CPU.

Dans l'ensemble, si votre but est de construire un système efficace, je vous recommande d'utiliser une implémentation de CPU pour ce problème car il sera plus rapide et plus facile à écrire.

Mais, si votre but est d'expérimenter ou tout simplement pour en apprendre davantage sur GPU, alors vous pouvez trouver l'application CUDA de tri fusion du papier dans le kit de développement CUDA:

http://developer.download.nvidia.com/compute/cuda/sdk/website/Data-Parallel_Algorithms.html

+1

CUDA n'a-t-il pas tout intérêt à utiliser un processeur inactif de toute façon? Même si vous n'obtenez aucune amélioration de vitesse sur un GPU par rapport à un CPU, vous aurez toujours une amélioration de 2X par rapport à un CPU uniquement, à condition de pouvoir utiliser efficacement le parallélisme supplémentaire. –

+0

@Robert Harvey - la plupart des utilisations de CUDA ne maintiennent pas le CPU occupé en même temps. Cependant, récemment, cela est devenu plus commun, et est généralement appelé hybride GPU/CPU. La nécessité de copier entre les mémoires CPU et GPU tend à rendre la tâche difficile pour obtenir de bonnes performances. Dans ce cas, je m'attendrais au mieux à atteindre 150% de la vitesse du processeur, et vous feriez mieux d'investir dans un système avec deux processeurs. – RD1

+0

Merci pour votre réponse. Je suis d'accord avec toutes vos notes sur le tri des chaînes sur un GPU, pensais-je de la même manière, mais j'avais espéré qu'il y avait un algorithme qui me manquait. – Kentzo