Semua platform diterima, mohon tentukan platform untuk jawaban Anda.
Pertanyaan serupa: Bagaimana secara pemrograman mendapatkan ukuran halaman cache CPU dalam C ++?
c++
c
caching
operating-system
systems-programming
paxos1977
sumber
sumber
SDL_GetCPUCacheLineSize
fungsi SDL2 , lalu lihat dicpuid macro
mana kode sumber rakitan untuk setiap model prosesor. Anda dapat melihatnya di imgur.com/a/KP57m6s , atau langsung mengintip sumbernya sendiri.Jawaban:
Di Linux (dengan kernel yang cukup baru), Anda bisa mendapatkan informasi ini dari / sys:
Direktori ini memiliki subdirektori untuk setiap level cache. Masing-masing direktori tersebut berisi file-file berikut:
Ini memberi Anda lebih banyak informasi tentang cache maka Anda akan berharap untuk tahu, termasuk ukuran cacheline (
coherency_line_size
) serta apa CPU berbagi cache ini. Ini sangat berguna jika Anda melakukan pemrograman multithreaded dengan data bersama (Anda akan mendapatkan hasil yang lebih baik jika data berbagi thread juga berbagi cache).sumber
cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size
kembali64
di sistem saya. Sama untuk folder index1,2,3 juga.Di Linux lihat sysconf (3).
Anda juga bisa mendapatkannya dari baris perintah menggunakan getconf:
sumber
Saya telah mengerjakan beberapa hal baris cache dan perlu menulis fungsi lintas platform. Saya berkomitmen untuk repo github di https://github.com/NickStrupat/CacheLineSize , atau Anda bisa menggunakan sumber di bawah ini. Jangan ragu untuk melakukan apa pun yang Anda inginkan dengannya.
sumber
Pada x86, Anda dapat menggunakan instruksi CPUID dengan fungsi 2 untuk menentukan berbagai properti cache dan TLB. Mem-parsing keluaran fungsi 2 agak rumit, jadi saya akan merujuk Anda ke bagian 3.1.3 dari Intel Processor Identification dan CPUID Instruction (PDF).
Untuk mendapatkan data ini dari kode C / C ++, Anda harus menggunakan perakitan inline, kompiler intrinsik, atau memanggil fungsi perakitan eksternal untuk melakukan instruksi CPUID.
sumber
Jika Anda menggunakan SDL2, Anda dapat menggunakan fungsi ini:
Yang mengembalikan ukuran ukuran garis cache L1, dalam byte.
Di mesin x86_64 saya, jalankan snippet kode ini:
Menghasilkan
CacheLineSize = 64
Saya tahu saya sedikit terlambat, tetapi hanya menambahkan informasi untuk pengunjung masa depan. Dokumentasi SDL saat ini mengatakan nomor yang dikembalikan adalah dalam KB, tetapi sebenarnya dalam byte.
sumber
Pada platform Windows:
dari http://blogs.msdn.com/oldnewthing/archive/2009/12/08/9933836.aspx
sumber
ARMv6 dan di atasnya memiliki
C0
atau Tipe Cache Register. Namun, ini hanya tersedia dalam mode istimewa.Misalnya, dari Manual Referensi Teknis Cortex ™ -A8 :
Jangan menganggap prosesor ARM memiliki cache (tampaknya, beberapa dapat dikonfigurasi tanpa satu). Cara standar untuk menentukannya adalah melalui
C0
. Dari ARM ARM , halaman B6-6:sumber
Anda juga dapat mencoba melakukannya secara terprogram dengan mengukur waktu. Jelas, itu tidak akan selalu setepat cpuid dan sejenisnya, tetapi lebih portabel. ATLAS melakukannya pada tahap konfigurasinya, Anda mungkin ingin melihatnya:
http://math-atlas.sourceforge.net/
sumber