2016-07-31 52 views
2

Wenn ein Datenelement geschrieben werden soll, wird zuerst der Block mit den Daten in den Cache und das Datenelement in den Cache geschrieben. Dies kann zu einer Verschmutzung des Caches führen. Um dies zu vermeiden, hat Intel keine zeitlichen Anweisungen eingeführt.Umgehung der Übersetzung vermeiden Umgehung des Puffers (TLB) bei mmap()

Wenn ich mmap() verwenden werde, um Daten in die Datei zu schreiben und nie wieder zu lesen, ist es dann möglich, die Erstellung eines TLB-Eintrags zu vermeiden? Gibt es Anweisungen, die nicht-zeitlichen Anweisungen ähnlich sind?

+1

Nein, ich bin mir ziemlich sicher, dass es nicht gibt, da Sie rigidpages nicht für file-backed mappings verwenden können. Die Verwendung von 'write' mit einer Puffergröße von vielleicht 1/2 L2-Cache-Größe oder etwas Ähnlichem könnte tatsächlich eine bessere Leistung bringen; du solltest testen. (Obwohl der Kernel prob. Beim Kopieren des Puffers in den Pagecache keine NT-Speicher verwendet). Sie können eine Verunreinigung des Seitencache vermeiden, wenn die Dateidaten * wirklich * lange Zeit nicht referenziert werden, indem Sie 'madvise (MADV_DONTNEED)' verwenden, um den Kernel dazu zu bringen, ihn nach dem Schreiben auf den Datenträger aus dem RAM zu löschen. –

+2

pwrite() ist möglicherweise passender als write() abhängig von Ihren Zugriffsmustern. Aber ja, du solltest unbedingt testen. Ein anderer Vorschlag besteht darin, zu versuchen, sicherzustellen, dass alle Dateiänderungen auf derselben CPU stattfinden, um die Verschmutzung zu verringern. Vergessen Sie auch nicht, die Kosten für einen endgültigen TLB-Shootdown zu messen, wenn die Datei nicht zugeordnet ist. – Pseudonym

Antwort

1

TLB-Einträge werden von der CPU benötigt, um von der virtuellen Adresse zur physischen Adresse zu mappen, daher ist es nicht möglich, sie mit mmap() oder einer ähnlichen API zu vermeiden.

Selbst wenn es möglich wäre, in dem TLB speichert die Zuordnung zu vermeiden, jeder Zugriff auf die Bildspeicher müßte die entsprechenden Einträge aus den Seitentabellen neu zu laden, so dass die Leistung wäre viel schlimmer. Nicht-temporale Zugriffe sind nur für Speicher sinnvoll, aber die Seitentabelleneinträge sind lesen.

+1

Sie könnten sich einen nicht-temporalen Hinweis für TLB-Einträge vorstellen, also könnten sie vielleicht früher gelöscht werden oder nur im L1-TLB bleiben, anstatt zum L2-TLB zu wechseln, wenn sie von L1 DTLB vertrieben werden. Dies würde analog zu PREFETCHNTA nur Daten in L1 bringen, ohne den größeren L2 zu verschmutzen. Es gibt keinen Mechanismus für so etwas mit TLB-Einträgen auf x86, aber nicht, weil es unmöglich ist, irgendetwas mit einem nicht-zeitlichen Hinweis für Lasten zu tun. (Guter Punkt, dass TLB Einträge im Cache geladen werden, nicht speichert, obwohl). –