Gibt es ein benutzerdefiniertes Speicherzuordnungs-Entwurfsmuster, das keine Metadaten in seinen Zuordnungen speichert? [geschlossen]

9

Im Grunde brauche ich einen Speicherpool für die schnelle Zuweisung kleiner Objekte. Idealerweise möchte ich die Zuordnungen sowohl auf dem Host als auch auf Speicher, die auf GPUs zugewiesen sind, durch cudaMalloc ersetzen. Ich kann meine eigenen schreiben, und ich werde es tun, wenn es sein muss, aber ich hätte nichts dagegen, in eine der soliden Open-Source-Implementierungen zu wechseln.

Das einzige Problem ist, dass der Speicherpool mit cudaMalloc den zugewiesenen Speicher nicht berühren kann. Mein Verständnis ist, dass viele (alle?) Der allgemeinen Speicherzuordner, wie die im Titel, eine kleine Menge von Metadaten in den zugewiesenen Daten speichern. Sie würden daher nicht funktionieren.

Kennt jemand einen Speicherzuordner, für den das nicht der Fall ist?

    
user2333829 26.01.2015, 15:40
quelle

2 Antworten

2

Wenn all Ihre kleinen Zuweisungen die gleiche Größe haben oder eine vernünftige obere Schranke haben, dann ist ein Poolzuordner mit fester Größe ein gutes Muster.

Die Idee ist, dass der Zuordner einen großen Block mit dem Systemaufruf ergreift und dann seine eigene freie Liste von Blöcken fester Größe innerhalb des großen Blocks verwaltet. Die Zuweisung ist so einfach wie die Blockade an der Spitze der freien Liste. Die Zuordnung ist etwas komplizierter, kann aber je nach Ihren Anforderungen auf verschiedene Arten implementiert werden.

Es ist einfach genug, um Ihre eigenen zu schreiben, oder wenn Sie Google C ++ Fixed Size Allocator finden Sie eine Reihe von guten Implementierungen einschließlich boost :: pool

    
Colin Andrews 27.01.2015 00:36
quelle
0

Jeder Zuordner muss irgendwo Metadaten speichern. Wenn der Zuordnungsbedarf einfacher wird, verringert sich natürlich die Menge der Metadaten.

Ich denke, ein normaler Fixed-Size-Allokator wird Ihnen immer noch Probleme bereiten, wenn ich Ihr Problem richtig verstehe. Sie haben eine wirklich spezielle Hardware-Einschränkung, so viel ich sehe.

Sie können natürlich einen festen Pool-Allokator verwenden, der nicht die Möglichkeit bietet, einzelne Zuweisungen freizugeben, sondern nur den gesamten Pool freizugeben. Somit würde die Notwendigkeit, Metadaten innerhalb des zugewiesenen Speichers zu speichern, eliminiert werden.

Natürlich können Sie immer einen Zuordner implementieren, der die Metadaten außerhalb des zugewiesenen Bereichs speichert, indem Sie einen anderen Speicherbereich verwenden. Aber die meisten Bibliotheken speichern die Metadaten in dem zugewiesenen Bereich, da dies für normale Architekturen am bequemsten ist.

Die beste Schätzung wäre also, einen festen Pool-Allokator zu finden, der entweder nicht die Funktionalität bietet, um einzelne Zuweisungen freizugeben, oder wo Sie diese Funktion einfach nicht verwenden können (und daher speichert der Zuordner keine). Dies ist natürlich nur eine Option, wenn es für Sie in Ordnung wäre, immer ganze Speicherpools statt einzelner Zuweisungen freizugeben (was auch eine gute Vorsichtsmaßnahme gegen Speicherlecks ist, falls es anwendbar ist).

Die andere Alternative wäre natürlich, einen eigenen Allokator zu implementieren, vielleicht auf der Basis eines einfachen Allokators, der möglichst einfache Metadaten verwendet.

    
Juergen 19.02.2015 00:34
quelle