Initialisation de milliards d’entiers à une valeur de 1

Qu’est-ce qu’un bon design de threads posix pour initialiser des milliards d’entiers en utilisant c / c ++ sur un processeur à 8 cœurs avec 32 Go de DRAM? Merci de votre aide.

Ceci est une opération sortingviale et vous n’avez pas besoin de considérer le multi-threading. memcpy simplement avec un memcpy dans un seul fil.

Le nombre exact de threads ne sera pas un facteur si contraignant, mais parfois, pour ces questions, il vaut la peine de se contenter d’utiliser, disons, 2 threads par cœur physique.

Mais le véritable goulot d’étranglement sera IO, en écrivant les données dans la RAM. Vous devez veiller à ce que les données à remplacer ne soient jamais lues avant de l’effacer. Ensuite, vous devez vous assurer que les écritures en mémoire apparaissent en gros morceaux et (si possible) en tant que “write through”.

Habituellement, quelque chose comme memcpy avec un tampon de taille fixe (certaines pages) qui contient le motif que vous voulez voir devrait être assez bien optimisé.

Qu’est-ce que c’est pour Selon l’utilisation, le scénario suivant peut fonctionner: vous initialisez une page de mémoire (plusieurs Ko) sur tous les 1. Ensuite, vous mappez cette page dans l’espace d’adressage virtuel autant de fois que nécessaire avec un indicateur de copie sur écriture. De cette façon, en lisant, vous obtiendrez tous ceux de toutes ces pages virtuelles. Au moment de l’écriture, le système allouera plus de pages physiques si nécessaire.

Peut-être un algorithme de division et de conquête ? Partitionnez la mémoire contenant les nombres entiers par un nombre correspondant au nombre de threads optimal pour votre système. Ensuite, lancez un thread par partition qui initialise tous ses entiers.

Si vous tentez le multithreading, l’alignement de vos écritures sur la taille de la ligne de cache native offrira probablement un débit de mémoire optimal. Comme tout le monde le dit, le débit de la mémoire va dominer les performances, mais une partie du temps processeur est nécessaire pour ces écritures. Minimiser ce temps avec des instructions multithreading et vectorisées peut être utile.

La vraie réponse est de profiler votre système (puisque vous avez défini une cible très spécifique, il semble que vous ne souhaitiez pas concevoir un algorithme équilibré qui soit suffisant pour la plupart des cibles). Les processeurs modernes qui ont access à 32 Go de mémoire DRAM ont souvent des compteurs de performance matérielle (Intel et AMD), ce qui facilite la recherche des processeurs et des activités de mise en cache.