2015-01-26 10 views
9

Grundsätzlich brauche ich einen Speicherpool für die schnelle Zuordnung von kleinen Objekten. Idealerweise möchte ich die Zuordnungen sowohl auf dem Host als auch auf Speicher, die auf GPUs zugewiesen sind, durch cudaMalloc ersetzen. Ich kann mein eigenes 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.Gibt es ein benutzerdefiniertes Speicherzuordnungsentwurfsmuster, das Metadaten in seinen Zuordnungen nicht speichert?

Das einzige Problem ist, dass mit cudaMalloc der Speicherpool 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 deshalb nicht arbeiten.

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

+0

Ich denke, hier ist ziemlich klar erklärt, die Interna von malloc, so können Sie Ihre eigenen basierend auf den bereitgestellten Informationen http://stackoverflow.com/questions/3479330/how-ismalloc-implemented-internally – SGrebenkin

+0

Nun Sie Sie müssen Metadaten irgendwo speichern * - wenn Sie die Metadaten auf dem Host und nur die zugeordneten Daten auf der CUDA-GPU speichern möchten, könnten die Dinge ziemlich hässlich und ineffizient werden. –

+0

Es müssen keine Metadaten mit einer Kompilierzeit Lösung sein –

Antwort

2

Wenn alle Ihre kleinen Zuordnungen die gleiche Größe haben oder eine vernünftige Obergrenze haben, dann ist ein Poolzuordner mit fester Größe ein gutes Muster.

Die Idee ist, dass der Zuordner einen großen Block mit dem Systemanruf 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 C++ google feste Größe allocator können Sie eine Reihe von guten Implementierungen einschließlich boost finden :: Pool

0

Alle allocator einige Metadaten speichern muss, irgendwo. Wenn der Zuordnungsbedarf einfacher wird, wird natürlich die Menge der Metadaten abnehmen.

Ich denke, eine normale feste Größe Allokator wird Ihnen immer noch Probleme, wenn ich Ihr Problem richtig verstehe. Sie haben eine ganz besondere Hardware-Einschränkung, soviel ich sehe.

Sie könnten natürlich einen festen Pool-Allokator verwenden, der keine freien Zuteilungen anbietet, sondern nur den gesamten Pool freigibt. 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. Die meisten Bibliotheken speichern jedoch 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 übrigens 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.