Menu
Percuma
Pendaftaran
rumah  /  Ubat-ubatan/ Cache bersekutu. Cache bersekutu

Cache bersekutu. Cache bersekutu

Cache dengan pemetaan langsung (peletakan);

cache bersekutu sepenuhnya;

· berbilang cache bersekutu atau sebahagian bersekutu.

Cache Dipetakan Terus(penginapan) adalah yang paling banyak
jenis penimbal mudah. Alamat memori secara unik mengenal pasti rentetan
cache di mana blok maklumat akan diletakkan. Pada masa yang sama, pra-
Diandaikan bahawa RAM dibahagikan kepada blok dan setiap satu
blok mana dalam penimbal diberi hanya satu baris. Ini ialah kaedah paparan yang mudah dan murah untuk dilaksanakan. Kelemahan utamanya ialah penugasan tegar satu baris dalam cache kepada blok OP tertentu. Oleh itu, jika program mengakses perkataan daripada dua blok berbeza yang dipetakan ke baris cache yang sama secara bergilir-gilir, baris tersebut akan sentiasa dikemas kini dan kebarangkalian hit akan menjadi rendah.

Cache Bersekutu Penuh mengatasi kelemahan yang langsung dengan membenarkan mana-mana blok RAM dimuatkan ke dalam mana-mana talian cache. Logik kawalan membezakan dua medan dalam alamat UE: medan tag dan medan perkataan. Medan teg sepadan dengan alamat blok OP. Untuk menyemak salinan blok dalam cache, logik kawalan cache mesti menyemak tag semua baris secara serentak untuk padanan dengan medan tag alamat. Pemetaan bersekutu memberikan fleksibiliti dalam memilih baris untuk blok yang baru direkodkan. Kelemahan asas kaedah ini ialah keperluan untuk menggunakan memori bersekutu yang mahal.

Jenis Berbilang Bersekutu atau Jenis Paparan Separa Bersekutu − ini adalah salah satu kompromi yang mungkin, menggabungkan kelebihan kaedah langsung dan bersekutu. Memori cache (kedua-dua tag dan data) dibahagikan kepada beberapa modul. Kebergantungan antara modul dan blok OP adalah tegar seperti dalam pemetaan langsung. Tetapi penempatan blok di sepanjang baris modul adalah sewenang-wenangnya, dan prinsip bersekutu digunakan untuk mencari baris yang dikehendaki dalam modul. Kaedah paparan ini adalah yang paling banyak digunakan dalam mikropemproses moden.

Memetakan sektor OP dalam cache.

Paparan jenis ini digunakan dalam semua komputer moden dan terdiri daripada fakta bahawa keseluruhan OP dibahagikan kepada sektor yang terdiri daripada nombor tetap blok berturut-turut. Memori cache juga dibahagikan kepada sektor yang mengandungi bilangan baris yang sama. Lokasi blok dalam sektor OP dan sektor cache adalah sama sepenuhnya. Pemetaan sektor-ke-cache dilakukan secara bersekutu, jadi mana-mana sektor daripada RAM boleh diletakkan dalam mana-mana sektor cache. Oleh itu, dalam proses operasi, ALU beralih kepada OP untuk mencari arahan seterusnya, akibatnya, dalam cache (jika tiada blok yang mengandungi arahan ini), keseluruhan sektor maklumat daripada OP dimuatkan ke dalam cache, lebih-lebih lagi, mengikut prinsip lokaliti, kerana ini, peningkatan ketara dalam kelajuan sistem.

Model cache hierarki

Sebagai peraturan, memori cache mempunyai seni bina berbilang peringkat. Contohnya, dalam komputer dengan cache dalaman 32 KB (dalam teras CPU) dan 1 MB luaran (dalam kes CPU atau pada papan induk), yang pertama akan dianggap cache tahap 1 (L1) dan yang terakhir ialah cache 2 -peringkat ke-(L2). Dalam sistem pelayan moden, bilangan tahap cache boleh sehingga empat, walaupun dua atau tiga tahap paling kerap digunakan.

Dalam sesetengah seni bina pemproses, cache L1 dibahagikan kepada cache arahan (InstructionCache, I-cache) dan cache data (DataCache, D-cache), tidak semestinya saiz yang sama. Dari sudut pandangan litar, lebih mudah dan lebih murah untuk mereka bentuk I-cache dan D-cache yang berasingan: pengambilan arahan dijalankan oleh I-box, dan data diambil oleh E-box dan F-box. , walaupun dalam kedua-dua kes A-box dan C-box terlibat. Semua blok ini adalah besar, dan adalah bermasalah untuk menyediakannya akses serentak dan pantas ke cache yang sama. Di samping itu, ini pasti memerlukan peningkatan dalam bilangan port akses, yang juga merumitkan tugas reka bentuk.

Memandangkan I-cache dan D-cache mesti menyediakan kependaman akses yang sangat rendah (ini benar untuk mana-mana cache L1), mereka perlu mengorbankan saiznya - biasanya ia adalah dari 16 hingga 32 KB. Lagipun, lebih kecil saiz cache, lebih mudah untuk mencapai akses kependaman rendah.

Memori cache tahap ke-2, sebagai peraturan, disatukan, iaitu, ia boleh mengandungi kedua-dua arahan dan data. Jika ia dibina ke dalam teras CPU, maka mereka bercakap tentang S-cache (SecondaryCache, cache sekunder), sebaliknya - mengenai B-cache (BackupCache, cache sandaran). Dalam CPU pelayan moden, volum S-cache adalah dari satu hingga beberapa megabait, aB-cache - sehingga 64 MB. Jika reka bentuk CPU menyediakan kehadiran cache terbina dalam tahap ke-3, maka ia dipanggil T-cache (TernaryCache, cache tertier). Sebagai peraturan, setiap tahap cache berturut-turut adalah lebih perlahan, tetapi lebih besar daripada yang sebelumnya. Jika B-cache terdapat dalam sistem (sebagai tahap terakhir model memori cache), maka ia boleh dikawal oleh kedua-dua CPU dan set logik sistem.

Jika pada masa pelaksanaan arahan tertentu dalam daftar tidak ada data untuknya, maka ia akan diminta dari tahap cache terdekat, iaitu dari D-cache. Jika mereka tiada dalam D-Cache, permintaan dihantar ke S-cache, dsb. Dalam kes yang paling teruk, data akan dihantar terus dari memori. Walau bagaimanapun, pilihan yang lebih menyedihkan adalah mungkin, apabila subsistem pengurusan memori maya sistem pengendalian (OS) berjaya memaksanya masuk ke dalam fail paging pada cakera keras. Dalam kes penghantaran dari RAM, kehilangan masa untuk menerima data yang diperlukan boleh dari puluhan hingga ratusan kitaran CPU, dan dalam kes data berada pada cakera keras, kita sudah boleh bercakap tentang berjuta-juta kitaran.

Cache Associativity

Salah satu ciri asas memori cache - tahap persekutuan - mencerminkan pembahagian logiknya. Hakikatnya ialah penghitungan berurutan bagi semua talian cache untuk mencari data yang diperlukan akan memerlukan berpuluh-puluh kitaran dan akan menafikan semua keuntungan daripada menggunakan memori yang dibina ke dalam CPU. Oleh itu, sel RAM berwayar keras ke talian cache (setiap baris boleh mengandungi data daripada set alamat tetap), yang mengurangkan masa carian dengan ketara. Lebih daripada satu baris cache boleh dikaitkan dengan setiap sel RAM: contohnya, n-wayset associative bermaksud maklumat pada alamat RAM tertentu boleh disimpan dalam n lokasi cache.

Pilihan tempat boleh dilakukan mengikut pelbagai algoritma, antaranya prinsip penggantian LRU (LeastRecentlyUsed, entri yang paling baru diminta diganti) dan LFU (LeastFrequentlyUsed, paling kerap diminta) paling kerap digunakan, walaupun terdapat pengubahsuaian. daripada prinsip-prinsip ini. Sebagai contoh, memori cache bersekutu sepenuhnya (bersekutu sepenuhnya), di mana maklumat yang terletak di alamat sembarangan dalam RAM boleh diletakkan dalam baris sembarangan. Pilihan lain ialah pemetaan langsung, di mana maklumat yang terletak di alamat sewenang-wenangnya dalam RAM boleh diletakkan hanya di satu tempat dalam cache. Sememangnya, pilihan ini memberikan prestasi tertinggi, kerana pengawal perlu "melihat" hanya satu baris cache semasa menyemak maklumat, tetapi ia juga paling kurang cekap, kerana pengawal tidak akan memilih tempat "optimum" semasa menulis. Untuk jumlah cache yang sama, skim persekutuan penuh akan menjadi yang paling cepat, tetapi paling cekap.

Cache bersekutu sepenuhnya ditemui dalam amalan, tetapi, sebagai peraturan, ia mempunyai jumlah yang sangat kecil. Contohnya, CPU Cyrix 6x86 menggunakan 256 bait cache arahan ini di hadapan cache 16 atau 64 KB L1 bersatu. Selalunya, skema bersekutu sepenuhnya digunakan dalam reka bentuk TLB (yang akan dibincangkan di bawah), cache alamat lompat, penimbal baca-tulis, dsb. Sebagai peraturan, tahap keterkaitan I-cache dan D-cache agak rendah (sehingga empat saluran) - peningkatan mereka Ia tidak sesuai, kerana ia membawa kepada peningkatan dalam kelewatan akses dan, akibatnya, menjejaskan prestasi secara negatif. Sebagai pampasan, keterkaitan cache-S ditingkatkan (biasanya sehingga 16 saluran), memandangkan kelewatan dalam mengakses cache ini adalah tidak penting. Sebagai contoh, menurut kajian tugas integer yang kerap digunakan, Intel Pentium III mempunyai 16K bait quad-lorong D-cache meliputi kira-kira 93% permintaan, dan 16K bait quad-lane I-cache sudah cukup untuk menampung 99% daripada permintaan.

Saiz baris dan teg cache

Ciri penting ingatan cache ialah saiz talian. Sebagai peraturan, satu rekod alamat (teg yang dipanggil) digunakan setiap baris, yang menunjukkan alamat dalam RAM yang sepadan dengan baris yang diberikan. Jelas sekali, penomboran bait individu tidak sesuai, kerana dalam kes ini, jumlah maklumat overhed dalam cache akan melebihi jumlah data itu sendiri beberapa kali. Oleh itu, satu teg biasanya bergantung pada satu baris, yang biasanya bersaiz 32 atau 64 bait (maksimum sebenar ialah 1024 bait), dan bersamaan dengan empat (kadang-kadang lapan) bit bas data sistem. Di samping itu, setiap baris cache disertakan dengan beberapa maklumat untuk memastikan toleransi kesalahan: satu atau lebih bit pariti (pariti) atau lapan atau lebih bait pengesanan dan pembetulan ralat (ECC, ErrorCheckingandCorrecting), walaupun dalam penyelesaian massa selalunya tidak menggunakan salah satu daripadanya. atau yang lain.

Saiz teg cache bergantung pada tiga faktor utama: saiz cache, jumlah maksimum RAM yang boleh dicache dan keterkaitan cache. Secara matematik, saiz ini dikira dengan formula:

Stag=log2(Smem*A/Scache),

di mana Stag ialah saiz satu tag cache, dalam bit; Smem - jumlah maksimum RAM yang boleh disimpan dalam cache, dalam bait; Scache - jumlah memori cache, dalam bait; A - persekutuan cache, dalam saluran.

Ia berikutan bahawa sistem dengan 1 GB RAM dan 1 MB cache dengan perkaitan dwi saluran akan memerlukan 11 bit untuk setiap teg. Perlu diperhatikan bahawa saiz baris cache itu sendiri tidak menjejaskan saiz teg dalam apa-apa cara, tetapi secara songsang mempengaruhi bilangan teg. Perlu difahami bahawa saiz baris cache tidak masuk akal untuk menjadikannya kurang daripada lebar bit bas data sistem, tetapi peningkatan berganda dalam saiz akan membawa kepada penyumbatan cache yang berlebihan dengan maklumat yang tidak perlu dan beban yang berlebihan pada bas sistem dan bas memori. Selain itu, jumlah maksimum memori cache yang boleh dicache tidak perlu sepadan dengan jumlah maksimum RAM yang boleh dipasang pada sistem. Jika situasi timbul apabila terdapat lebih banyak RAM daripada yang boleh dicache, maka cache akan mengandungi maklumat hanya dari segmen bawah RAM. Ini betul-betul keadaan dengan platform Socket7/Super7. Chipset untuk platform ini membenarkan jumlah RAM yang besar (dari 256 MB hingga 1 GB), manakala jumlah cache selalunya terhad kepada 64 MB pertama (kita bercakap tentang cache B yang terletak pada motherboard) disebabkan penggunaan daripada 8 - bit cip SRAM tag yang murah (2 bit daripadanya dikhaskan untuk penunjuk kesahihan dan perubahan baris). Ini mengakibatkan penurunan yang ketara dalam prestasi.

Mengapakah kita memerhatikan peningkatan berterusan dalam prestasi program berbenang tunggal? Pada masa ini, kita berada di peringkat pembangunan teknologi mikropemproses, apabila peningkatan kelajuan aplikasi berbenang tunggal hanya bergantung pada ingatan. Bilangan teras semakin meningkat, tetapi kekerapan ditetapkan dalam 4 GHz dan tidak memberikan peningkatan prestasi.

Kelajuan dan kekerapan operasi memori adalah sebab utama mengapa kami mendapat "kek percuma kami" (pautan). Itulah sebabnya penting untuk menggunakan memori secekap yang kita boleh, dan lebih-lebih lagi sepantas cache. Untuk mengoptimumkan program untuk komputer tertentu, adalah berguna untuk mengetahui ciri-ciri memori cache pemproses: bilangan tahap, saiz, panjang talian. Ini amat penting dalam kod berprestasi tinggi - kernel sistem, perpustakaan matematik.

Bagaimana untuk menentukan ciri-ciri cache automatik? (sudah tentu, cpuinfo tidak dianggap sebagai dihuraikan, jika hanya kerana pada akhirnya kami ingin mendapatkan algoritma yang boleh dilaksanakan dengan mudah dalam sistem pengendalian lain. Mudah, bukan?) Itulah yang akan kami lakukan sekarang .

Sedikit teori

Tiga jenis cache kini wujud dan digunakan secara meluas: cache dipetakan langsung, cache bersekutu dan cache berbilang bersekutu.
Cache pemetaan langsung
- baris RAM yang diberikan boleh dipetakan kepada satu baris cache, tetapi banyak baris RAM yang mungkin boleh dipetakan ke setiap baris cache.
Cache bersekutu (cache bersekutu sepenuhnya)
- mana-mana talian RAM boleh dipetakan ke mana-mana talian cache.
Cache Bersekutu Berbilang
- memori cache dibahagikan kepada beberapa "bank", yang setiap satunya berfungsi sebagai cache dipetakan langsung, jadi barisan RAM boleh dipetakan bukan kepada satu kemasukan cache yang mungkin (seperti yang berlaku dalam kes peta langsung ), tetapi kepada salah satu daripada beberapa bank; Pemilihan bank adalah berdasarkan LRU atau mekanisme lain untuk setiap talian cache.

LRU - anjakan baris "panjang tidak digunakan" itu sendiri, cache memori.

Idea

Untuk menentukan bilangan tahap cache, anda perlu mempertimbangkan susunan akses memori, di mana peralihan akan dapat dilihat dengan jelas. Tahap cache yang berbeza berbeza terutamanya dalam kelajuan tindak balas memori. Sekiranya berlaku "cache miss" untuk cache L1, data akan dicari dalam tahap memori seterusnya, dan jika saiz data lebih besar daripada L1 dan kurang daripada L2, maka kelajuan tindak balas memori akan menjadi kelajuan tindak balas L2. Kenyataan sebelum ini juga benar dalam kes umum.

Adalah jelas bahawa kita perlu memilih ujian yang mana kita akan melihat dengan jelas cache terlepas dan mengujinya pada pelbagai saiz data.

Mengetahui logik cache berbilang bersekutu yang berfungsi mengikut algoritma LRU, tidak sukar untuk menghasilkan algoritma di mana cache "jatuh", tidak ada yang rumit - melalui garisan. Kriteria kecekapan ialah masa satu akses memori. Sememangnya, anda perlu mengakses semua elemen rentetan secara berurutan, mengulangi banyak kali untuk purata hasilnya. Sebagai contoh, mungkin terdapat kes apabila garisan muat dalam cache, tetapi untuk pas pertama kami memuatkan talian daripada RAM dan oleh itu mendapat masa yang tidak mencukupi sepenuhnya.

Saya ingin melihat sesuatu seperti langkah, melepasi garisan dengan panjang yang berbeza. Untuk menentukan sifat langkah, pertimbangkan contoh pas baris untuk cache langsung dan bersekutu, kes cache berbilang bersekutu akan menjadi purata antara cache dipetakan langsung dan cache bersekutu.

Cache bersekutu

Sebaik sahaja saiz data melebihi saiz cache,
cache bersekutu sepenuhnya "rindu" pada setiap akses memori.

Cache langsung

Pertimbangkan saiz baris yang berbeza. - menunjukkan bilangan maksimum kesilapan yang akan dibelanjakan oleh pemproses untuk mengakses elemen tatasusunan semasa laluan seterusnya melalui baris.

Seperti yang anda lihat, masa capaian memori tidak meningkat secara mendadak, tetapi apabila jumlah data meningkat. Sebaik sahaja saiz data melebihi saiz cache, akan ada kesilapan pada setiap akses memori.

Oleh itu, untuk cache bersekutu, langkahnya adalah menegak, manakala untuk cache langsung, ia akan meningkat secara beransur-ansur sehingga dua kali ganda saiz cache. Cache berbilang bersekutu akan menjadi kes biasa, "benjolan", jika hanya kerana masa akses tidak boleh lebih baik daripada yang langsung.

Jika kita bercakap tentang memori, maka yang terpantas ialah cache, diikuti dengan operasi, yang paling perlahan ialah pertukaran, kita tidak akan bercakap mengenainya pada masa akan datang. Sebaliknya, tahap cache yang berbeza (sebagai peraturan, hari ini pemproses mempunyai 2-3 tahap cache) mempunyai kelajuan tindak balas memori yang berbeza: semakin tinggi tahap, semakin perlahan kelajuan tindak balas. Oleh itu, jika garisan diletakkan pada tahap pertama cache (yang, secara kebetulan, adalah sepenuhnya bersekutu), masa tindak balas akan kurang daripada garisan yang jauh lebih besar daripada saiz cache tahap pertama . Oleh itu, akan terdapat beberapa dataran tinggi pada graf masa tindak balas memori berbanding saiz baris - dataran tinggi * tindak balas memori, dan dataran tinggi yang disebabkan oleh pelbagai tahap cache.

*Fungsi dataran tinggi - ( i:x, f(xi) - f(xi+1)< eps: eps → 0 }

Mari kita mula melaksanakan

Kami akan menggunakan C (ANSI C99) untuk pelaksanaan.

Kod itu ditulis dengan cepat, laluan biasa melalui baris yang berbeza panjang, kurang daripada 10mb, yang dilakukan berulang kali. (Kami akan memberikan kepingan kecil program yang membawa beban semantik).

Untuk (i = 0; i< 16; i++) { for (j = 0; j < L_STR; j++) A[j]++; }

Kami melihat carta - dan kami melihat satu langkah besar. Tetapi secara teori, semuanya ternyata baik-baik saja. Ia menjadi perlu untuk memahami: mengapa ini berlaku? Dan bagaimana untuk membetulkannya?

Jelas sekali, ini boleh berlaku atas dua sebab: sama ada pemproses tidak mempunyai memori cache, atau pemproses sangat pandai meneka akses memori. Oleh kerana pilihan pertama lebih dekat dengan fiksyen, sebab untuk segala-galanya adalah ramalan hits yang baik.

Hakikatnya ialah hari ini jauh dari pemproses teratas, sebagai tambahan kepada prinsip lokaliti spatial, juga meramalkan janjang aritmetik dalam susunan akses memori. Oleh itu, akses memori perlu secara rawak.

Panjang tatasusunan rawak harus setanding dengan panjang rentetan utama untuk menghilangkan butiran besar akses, serta panjang tatasusunan tidak boleh menjadi kuasa dua, kerana ini, "tindihan ” berlaku - yang mungkin mengakibatkan outlier. Adalah lebih baik untuk menetapkan pemalar kebutiran, termasuk jika kebutiran ialah nombor perdana, maka kesan bertindih boleh dielakkan. Dan panjang tatasusunan rawak ialah fungsi panjang rentetan.
untuk (i = 0; i< j; i++) { for (m = 0; m < L; m++) { for (x = 0; x < M; x++){ v = A[ random[x] + m ]; } } }

Selepas itu, kami mengejutkan "gambar" yang ditunggu-tunggu, yang kami bincangkan pada mulanya.

Program ini dibahagikan kepada 2 bahagian - ujian dan pemprosesan data. Tulis skrip dalam 3 baris untuk menjalankan atau menjalankannya 2 kali dengan tangan, tentukan sendiri.

Saiz penyenaraian Linux.

#termasuk #termasuk #termasuk #termasuk #define T char #define MAX_S 0x1000000 #define L 101 T A yang tidak menentu; int m_rand; int utama ()( struktur statik timespec t1, ​​​​t2; memset ((kosong*)A, 0, saiz (A)); srand(masa(NULL)); int v, M; daftar int i, j, k , m , x; untuk (k = 1024; k< MAX_S;) { M = k / L; printf("%g\t", (k+M*4)/(1024.*1024)); for (i = 0; i < M; i++) m_rand[i] = L * i; for (i = 0; i < M/4; i++) { j = rand() % M; x = rand() % M; m = m_rand[j]; m_rand[j] = m_rand[i]; m_rand[i] = m; } if (k < 100*1024) j = 1024; else if (k < 300*1024) j = 128; else j = 32; clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &t1); for (i = 0; i < j; i++) { for (m = 0; m < L; m++) { for (x = 0; x < M; x++){ v = A[ m_rand[x] + m ]; } } } clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &t2); printf ("%g\n",1000000000. * (((t2.tv_sec + t2.tv_nsec * 1.e-9) - (t1.tv_sec + t1.tv_nsec * 1.e-9)))/(double)(L*M*j)); if (k >

Saiz penyenaraian Windows.c

#termasuk #termasuk #termasuk #termasuk #termasuk #termasuk menggunakan ruang nama std; #define T char #define MAX_S 0x1000000 #define L 101 T A yang tidak menentu; int m_rand; int utama ()( LARGE_INTEGER freq; LARGE_INTEGER time1; LARGE_INTEGER time2; QueryPerformanceFrequency(&freq); memset ((void*)A, 0, sizeof (A)); srand(time(NULL)); int v, M; register int i, j, k, m, x; untuk (k = 1024; k< MAX_S;) { M = k / L; printf("%g\t", (k+M*4)/(1024.*1024)); for (i = 0; i < M; i++) m_rand[i] = L * i; for (i = 0; i < M/4; i++) { j = rand() % M; x = rand() % M; m = m_rand[j]; m_rand[j] = m_rand[i]; m_rand[i] = m; } if (k < 100*1024) j = 1024; else if (k < 300*1024) j = 128; else j = 32; QueryPerformanceCounter(&time1); for (i = 0; i < j; i++) { for (m = 0; m < L; m++) { for (x = 0; x < M; x++){ v = A[ m_rand[x] + m ]; } } } QueryPerformanceCounter(&time2); time2.QuadPart -= time1.QuadPart; double span = (double) time2.QuadPart / freq.QuadPart; printf ("%g\n",1000000000. * span/(double)(L*M*j)); if (k >100*1024) k += k/16; lain k += 4*1024; ) pulangan 0; )

Secara umum, saya fikir semuanya jelas, tetapi saya ingin menetapkan beberapa perkara.

Tatasusunan A diisytiharkan sebagai tidak menentu - arahan ini menjamin kita bahawa akan sentiasa ada panggilan ke tatasusunan A, iaitu, ia tidak akan "dipotong" oleh sama ada pengoptimum atau pengkompil. Ia juga bernilai menyebut bahawa keseluruhan beban pengiraan dilakukan sebelum pengukuran masa, yang membolehkan kita mengurangkan pengaruh latar belakang.

Fail diterjemahkan ke dalam penghimpun pada Ubuntu 12.04 dan pengkompil gcc 4.6 - kitaran disimpan.

Pemprosesan data

Adalah logik untuk menggunakan derivatif untuk pemprosesan data. Dan walaupun fakta bahawa apabila susunan pembezaan meningkat, bunyi meningkat, derivatif kedua dan sifatnya akan digunakan. Tidak kira betapa bising derivatif kedua, kami hanya berminat dengan tanda terbitan kedua.

Kami mendapati semua titik di mana terbitan kedua lebih besar daripada sifar (dengan sedikit ralat kerana terbitan kedua, selain dipertimbangkan secara berangka, sangat bising). Kami menetapkan fungsi pergantungan tanda derivatif kedua fungsi pada saiz cache. Fungsi mengambil nilai 1 pada titik di mana tanda terbitan kedua lebih besar daripada sifar, dan sifar jika tanda terbitan kedua kurang daripada atau sama dengan sifar.

Titik berlepas adalah permulaan setiap langkah. Selain itu, sebelum memproses data, adalah perlu untuk mengalih keluar satu outlier yang tidak mengubah beban semantik data, tetapi mencipta bunyi yang ketara.

Penyenaraian fail data_pr.c
#termasuk #termasuk #termasuk pusingan berganda (x berganda) ( int mul = 100; jika (x > 0) kembalikan lantai(x * mul + .5) / mul; jika tidak kembalikan siling(x * mul - .5) / mul; ) saiz apungan, masa , der_1, der_2; int main()( saiz = 0; masa = 0; der_1 = 0; der_2 = 0; int i, z = 110; untuk (i = 1; i< 110; i++) scanf("%g%g", &size[i], &time[i]); for (i = 1; i < z; i++) der_1[i] = (time[i]-time)/(size[i]-size); for (i = 1; i < z; i++) if ((time[i]-time)/(size[i]-size) >2) der_2[i] = 1; else der_2[i] = 0; //sisir untuk (i = 0; i< z; i++) if (der_2[i] == der_2 && der_2 != der_2[i]) der_2 = der_2[i]; for (i = 0; i < z-4; i++) if (der_2[i] == der_2 && der_2[i] != der_2 && der_2[i] != der_2) { der_2 = der_2[i]; der_2 = der_2[i]; } for (i = 0; i < z-4; i++) if (der_2[i] == der_2 && der_2[i] != der_2 && der_2[i] != der_2 && der_2[i] != der_2) { der_2 = der_2[i]; der_2 = der_2[i]; der_2 = der_2[i]; } // int k = 1; for (i = 0; i < z-4; i++){ if (der_2[i] == 1) printf("L%d = %g\tMb\n", k++, size[i]); while (der_2[i] == 1) i++; } return 0; }

Ujian

CPU/OS/kernel version/compiler/compile keys - akan ditentukan untuk setiap ujian.

  • Intel Pentium CPU P6100 @2.00GHz / Ubuntu 12.04 / 3.2.0-27-generik / gcc -Wall -O3 size.c -lrt

    L1 = 0.05 Mb
    L2 = 0.2 Mb
    L3 = 2.7 Mb

  • Saya tidak akan memberikan semua ujian yang baik, mari kita bercakap tentang "Rake"

Mari kita bercakap tentang "rake"

Rake dikesan semasa memproses data pada pemproses pelayan Intel Xeon 2.4/L2 = 512 kb/Windows Server 2008

Masalahnya terletak pada bilangan mata yang kecil yang berada dalam selang waktu mencapai dataran tinggi - oleh itu, lompatan dalam derivatif kedua tidak dapat dilihat dan dianggap sebagai bunyi.

Anda boleh menyelesaikan masalah ini menggunakan kaedah kuasa dua terkecil, atau menjalankan ujian semasa menentukan zon dataran tinggi.

Saya ingin mendengar cadangan anda tentang cara menyelesaikan masalah ini.

Bibliografi

  • Makarov A.V. Seni bina komputer dan pengaturcaraan peringkat rendah.
  • Ulrich Drepper

Pembangun memori cache telah menghadapi masalah bahawa mana-mana sel memori utama yang besar berpotensi berada dalam memori cache. Jika set data kerja yang digunakan dalam program ini cukup besar, maka ini bermakna banyak serpihan memori utama akan bersaing untuk setiap tempat dalam memori cache. Seperti yang dilaporkan sebelum ini, nisbah antara cache dan memori utama adalah 1 hingga 1000.

3.3.1 Pergaulan

Ia mungkin untuk melaksanakan memori cache di mana setiap baris cache boleh menyimpan salinan mana-mana lokasi memori. Ia dikenali sebagai cache bersekutu sepenuhnya (cache bersekutu sepenuhnya). Untuk mengakses talian cache, teras pemproses perlu membandingkan teg setiap baris cache dengan teg alamat yang diminta. Teg perlu menyimpan keseluruhan alamat, yang tidak akan ditentukan oleh offset dalam baris cache (bermaksud bahawa nilai S yang ditunjukkan dalam rajah dalam bahagian 3.2 akan menjadi sifar).

Terdapat cache yang dilaksanakan dengan cara ini, tetapi melihat saiz cache L2 yang sedang digunakan, ia tidak praktikal. Ambil perhatian bahawa cache 4MB dengan baris cache 64B sepatutnya mempunyai 65,536 entri. Untuk mendapatkan prestasi yang mencukupi, logik cache mesti boleh, dalam beberapa kitaran, untuk memilih daripada semua entri ini yang sepadan dengan teg yang diberikan. Kos untuk melaksanakan skim sedemikian akan menjadi sangat besar.

Rajah 3.5: Perwakilan skematik cache bersekutu sepenuhnya

Setiap baris cache memerlukan pembanding untuk melakukan perbandingan teg yang besar (perhatikan bahawa S ialah sifar). Huruf di sebelah setiap sambungan menunjukkan lebar sambungan dalam bit. Jika tiada apa yang dinyatakan, maka lebar sambungan adalah satu bit. Setiap pembanding mesti membandingkan dua nilai, setiap satunya adalah lebar bit T. Kemudian, berdasarkan keputusan, kandungan baris cache yang sepadan harus dipilih dan disediakan. Untuk melakukan ini, anda perlu menggabungkan seberapa banyak set talian data O kerana terdapat segmen cache (baldi cache). Bilangan transistor yang diperlukan untuk melaksanakan satu pembanding adalah besar, sebahagiannya kerana pembanding mestilah sangat pantas. Pembanding berulang tidak boleh digunakan. Satu-satunya cara untuk menjimatkan bilangan pembanding ialah mengurangkan bilangan mereka dengan perbandingan teg berulang. Ini tidak berfungsi atas sebab yang sama yang tidak dilakukan oleh pembanding lelaran: ia akan mengambil masa terlalu lama.

Cache bersekutu sepenuhnya adalah praktikal untuk cache kecil (contohnya, cache TLB pada sesetengah pemproses Intel adalah bersekutu sepenuhnya), tetapi cache perlu kecil - sangat kecil. Kita bercakap tentang maksimum beberapa dozen rekod.

L1i, L1d dan cache tahap yang lebih tinggi memerlukan pendekatan yang berbeza. Apa yang anda boleh lakukan ialah mengehadkan carian anda. Dalam kes yang paling ekstrem, setiap teg dipetakan kepada tepat satu entri cache. Pengiraan adalah mudah: untuk cache 4MB/64B dengan 65,536 entri, kami boleh mengakses setiap entri secara terus dan menggunakan bit 6 hingga 21 alamat (16 bit) untuk melakukan ini. 6 bit yang lebih rendah ialah indeks baris cache.


Rajah 3.6: Perwakilan skematik cache dipetakan langsung

Seperti yang dapat dilihat daripada Rajah 3.6, pelaksanaan tersebut cache dipetakan langsung (cache dipetakan langsung) boleh menjadi cepat dan mudah. Ia memerlukan hanya satu pembanding, satu pemultipleks (dua ditunjukkan dalam rajah ini kerana teg dan data dipisahkan, tetapi ini bukan keperluan reka bentuk yang ketat), dan beberapa logik untuk memilih kandungan yang mengandungi baris cache yang sah. Komparator adalah kompleks kerana keperluan mengenai kelajuan, tetapi kini hanya ada satu; akibatnya, lebih banyak usaha boleh dibelanjakan untuk menjadikannya lebih pantas. Kerumitan sebenar pendekatan ini terletak pada pemultipleks. Bilangan transistor dalam pemultipleks mudah berkembang dalam O(log N), di mana N ialah bilangan baris cache. Ini boleh diterima, tetapi ia boleh menghasilkan pemultipleks yang perlahan, dalam hal ini kelajuan boleh ditingkatkan dengan membelanjakan wang untuk transistor dalam pemultipleks dan menyelaraskan beberapa kerja untuk meningkatkan kelajuan. Jumlah bilangan transistor akan berkembang dengan perlahan berbanding dengan saiz cache, yang menjadikan ini penyelesaian yang sangat menarik. Tetapi pendekatan ini mempunyai kelemahan: ia hanya berfungsi jika alamat yang digunakan dalam program diagihkan secara sama rata berbanding bit yang digunakan untuk pemetaan langsung. Jika ini tidak berlaku, dan biasanya begitu, sesetengah entri cache digunakan secara aktif dan oleh itu dialihlokasi berulang kali, manakala yang lain hampir tidak digunakan sama sekali atau kekal kosong.


Rajah 3.7: Perwakilan skematik cache dengan pelbagai persekutuan

Masalah ini boleh diselesaikan dengan menggunakan memori cache dengan pergaulan berbilang (set berkaitan). Cache berbilang persekutuan menggabungkan ciri cache bersekutu sepenuhnya dan cache dipetakan langsung, sebahagian besarnya mengelakkan keburukan penyelesaian ini. Rajah 3.7 menunjukkan susun atur cache dengan pelbagai perkaitan. Memori untuk tag dan data dibahagikan kepada set, pemilihannya dilakukan mengikut alamat. Ini serupa dengan cache dipetakan langsung. Tetapi daripada menggunakan elemen berasingan untuk setiap nilai dalam set, set yang sama digunakan untuk cache beberapa nilai yang kecil. Teg untuk semua elemen set dibandingkan secara selari, yang serupa dengan operasi cache bersekutu sepenuhnya.

Hasilnya ialah cache yang agak teguh terhadap kesilapan disebabkan pemilihan alamat yang buruk atau sengaja dengan nombor set yang sama pada masa yang sama, dan saiz cache tidak dihadkan oleh bilangan pembanding yang boleh beroperasi secara selari. Jika cache bertambah (lihat rajah), hanya bilangan lajur yang bertambah, bukan bilangan baris. Bilangan baris meningkat hanya jika keterkaitan cache meningkat. Hari ini, pemproses cache L2 menggunakan tahap persekutuan sehingga 16 dan lebih tinggi. Cache L1 biasanya ditetapkan kepada tahap 8.

Jadual 3.1: Kesan Saiz Cache, Associativity dan Saiz Talian Cache

Saiz
ingatan cache
L2
pergaulan
paparan langsung 2 4 8
CL=32CL=64 CL=32CL=64 CL=32CL=64 CL=32CL=64
512k 27 794 595 20 422 527 25 222 611 18 303 581 24 096 510 17 356 121 23 666 929 17 029 334
1M 19 007 315 13 903 854 16 566 738 12 127 174 15 537 500 11 436 705 15 162 895 11 233 896
2M 12 230 962 8 801 403 9 081 881 6 491 011 7 878 601 5 675 181 7 391 389 5 382 064
4M 7 749 986 5 427 836 4 736 187 3 159 507 3 788 122 2 418 898 3 430 713 2 125 103
8M 4 731 904 3 209 693 2 690 498 1 602 957 2 207 655 1 228 190 2 111 075 1 155 847
16M 2 620 587 1 528 592 1 958 293 1 089 580 1 704 878 883 530 1 671 541 862 324

Jika kita mempunyai cache 4MB/64B dan persekutuan 8 saluran, maka kita akan mempunyai 8192 set dalam cache dan hanya 13 bit tag diperlukan untuk menangani set cache. Untuk menentukan mana satu entri (jika ada) dalam set cache mengandungi baris cache beralamat, 8 tag perlu dibandingkan. Ini boleh dilakukan dalam masa yang sangat singkat. Seperti yang anda lihat dari amalan, ini masuk akal.

Jadual 3.1 menunjukkan bilangan cache L2 terlepas untuk program (dalam kes ini, pengkompil gcc, yang pembangun kernel Linux anggap sebagai penanda aras yang paling penting) apabila menukar saiz cache, saiz baris cache dan persekutuan berbilang nilai. Dalam Bahagian 7.2, kami akan memperkenalkan alat simulasi cache yang diperlukan untuk ujian ini.

Ringkasnya, jika ia belum jelas, hubungan semua nilai ini ialah saiz cache

saiz baris cache x persekutuan x bilangan set

Pemetaan alamat-ke-cache dikira sebagai

O = saiz baris cache log2

S = log2 bilangan set

mengikut rajah dalam bahagian 3.2.


Rajah.3.8: Saiz cache dan tahap persekutuan (CL=32)

nasi. 3.8 menjadikan data jadual lebih mudah difahami. Angka tersebut menunjukkan data untuk baris cache dengan saiz tetap 32 bait. Melihat nombor untuk saiz cache yang diberikan, anda dapat melihat bahawa persekutuan benar-benar boleh membantu mengurangkan kehilangan cache dengan ketara. Untuk cache 8 MB, beralih daripada pemetaan langsung kepada persekutuan 2 hala menjimatkan hampir 44% cache. Jika cache berbilang persekutuan digunakan, maka pemproses boleh menyimpan set kerja yang lebih besar dalam cache berbanding dalam kes cache dipetakan langsung.

Anda kadangkala boleh membaca dalam literatur bahawa memperkenalkan persekutuan mempunyai kesan yang sama seperti menggandakan saiz cache. Ini, seperti yang dilihat dalam kes beralih daripada cache 4 MB ke cache 8 MB, adalah benar dalam beberapa kes yang melampau. Tetapi ini, sudah tentu, tidak benar dengan peningkatan seterusnya dalam pergaulan. Seperti yang dapat dilihat daripada data, peningkatan seterusnya dalam persekutuan memberikan keuntungan yang jauh lebih kecil. Walau bagaimanapun, kita tidak seharusnya mengabaikan sepenuhnya fakta ini. Dalam program contoh kami, penggunaan memori puncak ialah 5.6 MB. Jadi dengan saiz cache 8 MB, set cache yang sama akan digunakan beberapa kali (lebih daripada dua kali). Apabila set kerja meningkat, penjimatan boleh meningkat, kerana, seperti yang kita lihat, dengan saiz cache yang lebih kecil, kelebihan menggunakan persekutuan akan menjadi lebih besar.

Secara umum, peningkatan persekutuan cache di atas 8 nampaknya mempunyai sedikit kesan pada satu utas beban kerja. Dengan kemunculan pemproses berbilang teras yang menggunakan cache L2 yang dikongsi, keadaan berubah. Kini anda pada asasnya mempunyai dua program yang mengakses cache yang sama, jadi dalam amalan, kesan penggunaan persekutuan harus berganda (atau empat kali ganda untuk pemproses teras empat). Oleh itu, boleh dijangkakan bahawa apabila bilangan teras bertambah, keterkaitan cache yang dikongsi akan meningkat. Memandangkan ini menjadi mustahil (persekutuan 16 saluran sudah sukar dilaksanakan), pereka bentuk pemproses akan mula menggunakan cache L3 biasa dan seterusnya, manakala cache L2 berpotensi dikongsi oleh beberapa subset teras.

Kesan lain yang boleh kita lihat dalam Rajah 3.8 ialah bagaimana meningkatkan saiz cache meningkatkan prestasi. Data ini tidak boleh ditafsirkan tanpa mengetahui saiz set kerja. Jelas sekali, cache sebesar memori utama harus membawa kepada hasil yang lebih baik daripada cache yang lebih kecil, jadi secara umum tiada had untuk meningkatkan saiz cache dan memperoleh faedah yang boleh diukur.

Seperti yang dinyatakan di atas, saiz set kerja pada puncaknya ialah 5.6 MB. Nilai ini tidak membenarkan kami mengira jumlah memori yang akan membawa manfaat maksimum, tetapi membolehkan kami menganggarkan saiz ini. Masalahnya ialah semua memori tidak digunakan secara berterusan dan oleh itu kami mempunyai konflik walaupun dengan cache 16M dan set kerja 5.6M (ingat kelebihan cache bersekutu 2 hala sebanyak 16MB berbanding versi paparan langsung). Tetapi selamat untuk mengatakan bahawa di bawah beban sedemikian, kelebihan cache 32 MB tidak akan menjadi penting. Walau bagaimanapun, siapa yang mengatakan bahawa set kerja harus kekal tidak berubah? Apabila beban kerja bertambah dari semasa ke semasa, begitu juga dengan saiz cache. Apabila membeli mesin dan memutuskan jumlah cache yang perlu dibayar, adalah berbaloi untuk mengukur saiz set berfungsi. Mengapa ini penting boleh dilihat dalam Rajah. 3.10.


Rajah 3.9: Susun atur memori yang digunakan dalam ujian

Dua jenis ujian dijalankan. Dalam ujian pertama, elemen diproses secara berurutan. Program ujian menggunakan penunjuk n , tetapi elemen tatasusunan dipautkan bersama supaya ia dilalui mengikut susunan ia berada dalam ingatan. Pilihan ini ditunjukkan di bahagian bawah Rajah 3.9. Terdapat satu rujukan belakang yang datang dari elemen terakhir. Dalam ujian kedua (bahagian atas rajah), unsur-unsur tatasusunan dilalui dalam susunan rawak. Dalam kedua-dua kes, unsur tatasusunan membentuk senarai berpaut tunggal kitaran.

Dalam ingatan sedemikian, mana-mana baris OP boleh terletak di mana-mana dalam memori cache, dan dalam sebarang kombinasi dengan baris lain. Litar perbandingan gabungan CC1-CC4 (Rajah 6.4) secara serentak menganalisis semua teg baris yang sedang dalam cache dan membandingkannya dengan alamat yang diterima daripada bas alamat daripada pemproses. Pada hit cache, baris dibaca ke dalam bas data (DB). Cache miss menggantikan baris dalam cache dengan baris yang diperlukan daripada RAM.

Kelebihan memori ini ialah kelajuan membacanya yang tinggi. Kelemahannya ialah kerumitan pelaksanaan perkakasan. Oleh itu, cache bersekutu sepenuhnya paling kerap digunakan dalam penimbal khusus, seperti penimbal destinasi cawangan, dengan jumlah baris yang kecil.

3. Cache Bersekutu Berbilang

Jenis ingatan ini adalah perantaraan antara dua di atas. Ia menggabungkan kesederhanaan cache dipetakan langsung dengan kelajuan carian bersekutu.

Memori cache dibahagikan kepada subset (blok) baris yang tidak bertindih. Setiap baris memori utama hanya boleh masuk ke dalam satu subset cache. Pemetaan langsung digunakan untuk mencari blok, dan carian bersekutu sepenuhnya digunakan untuk mencari dalam subset. Bilangan baris dalam subset cache menentukan bilangan entri (port) cache itu sendiri.

Jika 2 n baris cache dibahagikan kepada 2 s subset tidak bertindih, maka S bit paling ketara RAM menunjukkan di mana subset (indeks) carian bersekutu harus dilakukan. Bit n-s yang lebih tinggi bagi alamat memori utama ialah tag.

Jika S=0, maka kita mendapat satu subset, yang sepadan dengan cache bersekutu sepenuhnya. Jika S=n, maka kita mendapat 2 n subset (iaitu, satu baris - satu subset). Ini ialah cache dipetakan langsung. Jika 1Sn-1, maka kita mempunyai cache berbilang bersekutu.

Rajah 6.5 menunjukkan contoh cache di mana S=1, iaitu, terdapat dua subset cache. Alamat fizikal 0111 yang dijana oleh pemproses dibahagikan kepada indeks 1, sama dengan digit paling tidak bererti, dan teg 011. Subset baris kedua dalam memori cache dipilih mengikut indeks, dan kemudian carian bersekutu dilakukan antara tag bagi baris subset yang dipilih. Baris 7 yang ditemui dengan tag 011 dipindahkan ke bas data (SD). Carian bersekutu dilakukan satu buat sementara waktu untuk semua teg menggunakan litar perbandingan gabungan CC1 dan CC2.

nasi. 6.5. Cache Bersekutu Berbilang

Pemproses moden menggunakan cache 4 dan 8 hala. Peningkatan dalam bilangan entrinya membawa kepada peningkatan pesat dalam kerumitan pelaksanaan perkakasan bahagian cache yang menyediakan carian bersekutu untuk teg.

Ciri-ciri merekod dan menggantikan maklumat dalam memori cache. Keselarasan cache

Akses baca boleh dimulakan serta-merta ke cache dan ke RAM. Kemudian, jika maklumat tidak ada dalam cache, pada masa fakta ini ditubuhkan, sebahagian daripada kitaran akses RAM akan telah selesai, yang boleh meningkatkan prestasi. Jika maklumat tersedia dalam cache, maka akses kepada RAM boleh dihentikan.

Apabila mengakses dengan menulis, dua kaedah digunakan: penulisan hanya dilakukan dalam cache atau serta-merta dalam cache dan dalam RAM. Kaedah ini dipanggil algoritma. terbalik WB (Tulis Balik) dan melalui rekod WT (Tulis Melalui) masing-masing. Yang kedua adalah lebih mudah, tetapi juga lebih perlahan, walaupun ia menjamin bahawa salinan maklumat yang sama dalam cache dan RAM sentiasa sepadan. Kebanyakan pemproses Intel awal menggunakan algoritma ini.

Algoritma tulis balik WB adalah lebih pantas. Pemindahan maklumat kepada RAM dilakukan hanya apabila satu baris dari halaman lain RAM dipindahkan ke tempat baris CACHE yang diberikan atau apabila arahan untuk mengemas kini kandungan CACHE dilaksanakan. Algoritma ini memerlukan kawalan yang lebih berhati-hati, kerana ada kalanya salinan maklumat yang sama berbeza dalam cache dan OP. Selain itu, tidak setiap baris berubah semasa masanya dalam cache. Jika tiada perubahan, maka tidak perlu menulis semula rentetan kembali ke RAM. Biasanya, bendera M (diubah suai) digunakan dalam memori tag. Ia ditetapkan semula kepada "0" apabila baris pertama kali dimuatkan ke dalam cache dan ditetapkan kepada "1" apabila maklumat ditulis kepadanya. Apabila memunggah baris dari cache, menulis ke RAM dilakukan hanya dengan satu nilai bendera M.

Apabila kehilangan berlaku, pengawal cache mesti memilih talian untuk diganti. Untuk pemetaan langsung, penyelesaian perkakasan adalah yang paling mudah. Hanya satu rentetan diuji, dan hanya rentetan itu boleh diganti. Dengan organisasi cache bersekutu atau berbilang bersekutu sepenuhnya, terdapat beberapa baris yang calon mesti dipilih sekiranya berlaku kesilapan. Untuk menyelesaikan masalah ini, peraturan khas berikut digunakan, dipanggil algoritma penggantian .

    FIFO (Masuk Pertama Keluar - pertama masuk - keluar dahulu);

    LRU (Kurang Terbaharu Digunakan - lebih lama daripada yang lain tidak digunakan);

    LFU (Kurang Kerap Digunakan - digunakan kurang kerap daripada yang lain);

    Rawak (random).

Kaedah pertama dan terakhir adalah yang paling mudah untuk dilaksanakan, tetapi mereka tidak mengambil kira kekerapan talian cache tertentu digunakan. Dalam kes ini, baris yang akan diakses dalam masa terdekat boleh dipadamkan. Kebarangkalian ralat untuk kaedah ini jauh lebih tinggi daripada untuk kedua dan ketiga.

Dalam algoritma FIFO, baris yang mula-mula memasuki cache dipilih untuk diganti. Setiap baris yang baru diperuntukkan dalam cache ditambah pada ekor baris gilir ini. Algoritma tidak mengambil kira penggunaan sebenar ia. Sebagai contoh, baris pertama yang dimuatkan mungkin mengandungi data yang diperlukan sepanjang kerja. Ini menghasilkan pengembalian segera kepada rentetan yang baru diganti.

Algoritma LRU menetapkan bahawa baris yang tidak digunakan untuk masa yang paling lama harus dipilih untuk dipadam. Setiap kali baris diakses, cap waktunya dikemas kini. Ini boleh dikaitkan dengan kos yang besar. Walau bagaimanapun, algoritma LRU paling kerap digunakan dalam amalan. Kelemahan ini ialah jika program melalui gelung besar yang merangkumi banyak baris, ia mungkin berlaku bahawa baris yang paling lama tidak diakses sebenarnya menjadi yang seterusnya digunakan.

Satu yang hampir dengan LRU ialah algoritma LFU, yang mengalih keluar baris yang paling kurang kerap digunakan. Dalam kes ini, adalah perlu untuk mengira bilangan akses kepada setiap baris dan mengawalnya. Ia mungkin ternyata bahawa baris yang baru sahaja ditulis ke memori cache dan yang telah diakses sekali sahaja (sementara baris lain telah diakses lebih banyak) mungkin menjadi yang paling kurang digunakan secara intensif. Ia boleh dialih keluar, yang merupakan kelemahan algoritma LFU.

Kandungan cache berubah di bawah kawalan pemproses. Dalam kes ini, ingatan utama boleh kekal tidak berubah. Sebaliknya, peranti luaran boleh menukar data dalam RAM dalam mod akses langsung. Dalam kes ini, memori cache tidak mengubah datanya. Keadaan ini menjadi lebih rumit dalam sistem berbilang pemproses, apabila beberapa pemproses mengakses memori yang dikongsi. Ada masalah kesepaduan cache.

Sistem pengkomputeran mempunyai ingatan yang koheren jika setiap operasi baca pada alamat yang dilakukan oleh mana-mana peranti mengembalikan nilai salinan terkini pada alamat itu, tanpa mengira peranti yang terakhir menulis. Masalah koheren adalah yang paling penting untuk sistem salinan balik. Mereka menggunakan protokol khas, dan bendera pengubahsuaian dan kebolehpercayaan maklumat ditambahkan pada setiap teg. Bendera ini membenarkan atau menafikan akses kepada data.

Pilihan yang diketahui untuk memetakan memori utama kepada memori cache boleh dikurangkan kepada tiga jenis: langsung, berpersatuan sepenuhnya dan separa bersekutu.

Pada paparan langsung alamat talian i cache yang mana blok boleh dipetakan j daripada OP, ditentukan secara unik oleh ungkapan: i = j mod m, di mana m ialah jumlah bilangan baris dalam cache, iaitu setiap baris cache dengan nombor i dipaparkan setiap satu m-blok ke OP, jika kira detik bermula dari blok, bilangannya adalah sama dengan i.

Pemetaan langsung ialah kaedah pemetaan yang mudah dan murah untuk dilaksanakan. Kelemahan utamanya ialah penugasan tegar satu baris dalam cache kepada blok OP tertentu. Oleh itu, jika program mengakses perkataan secara bergilir-gilir daripada dua blok berbeza yang dipetakan ke baris cache yang sama, baris ini akan sentiasa dikemas kini dan kebarangkalian hit akan menjadi rendah.

Paparan bersekutu sepenuhnya mengatasi kelemahan yang langsung dengan membenarkan mana-mana blok RAM dimuatkan ke dalam mana-mana talian cache. Pemetaan bersekutu memberikan fleksibiliti dalam memilih baris untuk blok yang baru direkodkan. Kelemahan asas kaedah ini ialah keperluan untuk melakukan pemeriksaan untuk semua baris cache.

Pemetaan separa bersekutu adalah salah satu kompromi yang mungkin, menggabungkan kelebihan kaedah pemetaan langsung dan bersekutu dan, pada tahap tertentu, bebas daripada kekurangannya. Memori cache dibahagikan kepada v subset (set), setiap satunya mengandungi k baris (adalah kebiasaan untuk mengatakan bahawa set mempunyai k input). Pergantungan antara set dan blok OP adalah sama seperti dalam pemetaan langsung: kepada garisan yang disertakan dalam set i, hanya blok memori utama yang jelas boleh dipaparkan, mengikut perkaitan i = j mod v, di mana j– alamat blok OP. Pada masa yang sama, penempatan blok di sepanjang baris modul adalah sewenang-wenangnya, dan prinsip bersekutu digunakan untuk mencari baris yang dikehendaki dalam modul.

Dalam kes yang melampau, apabila v = m, k= 1, pemetaan berbilang bersekutu dikurangkan kepada yang langsung, dan apabila v = 1,k = m- kepada yang bersekutu.

Bergantung pada kaedah menentukan korespondensi bersama baris cache dan blok memori utama, tiga seni bina cache dibezakan:

Cache bersekutu sepenuhnya

Cache pemetaan langsung (cache dipetakan langsung);

set- (sebahagian atau berbilang-) cache bersekutu (cache bersekutu set).

AT cache bersekutu sepenuhnya mana-mana blok memori utama boleh berada dalam mana-mana talian cache, atau mana-mana talian cache boleh memetakan ke mana-mana blok memori utama. Dalam kes ini, bit atas alamat data cache, tolak bit yang menentukan kedudukan (offset) data dalam baris (blok), dimasukkan ke dalam katalog dan digunakan sebagai teg. Dalam seni bina sedemikian, untuk menentukan sama ada terdapat data dalam cache pada alamat tertentu, adalah perlu untuk membandingkan bit atas alamat ini dengan tag semua baris dalam direktori cache. Jika perbandingan sedemikian dilakukan secara berurutan, maka ia akan mengambil masa terlalu lama, dan memori cache menjadi tidak bermakna kerana prestasi rendah. Oleh itu, perbandingan sedemikian mesti dilakukan secara selari untuk semua tag. Keperluan ini paling baik dipenuhi oleh memori bersekutu, iaitu, teg mesti disimpan dalam ingatan bersekutu teg cache.



Organisasi memori cache sedemikian adalah masalah perkakasan kompleks yang boleh diselesaikan hanya untuk volum kecil, iaitu, cache bersekutu sepenuhnya, kerana kerumitannya, tidak boleh mempunyai volum yang besar dan digunakan, sebagai peraturan, untuk tujuan tambahan. Sebagai contoh, dalam pemproses Intel, cache bersekutu sepenuhnya digunakan dalam blok paging untuk membina penimbal terjemahan persatuan TLB (Translation Look aside Buffer), direka untuk mempercepatkan akses kepada halaman yang banyak digunakan.

Seni bina yang bertentangan ialah cache pemetaan langsung. Dalam cache dipetakan terus, blok tertentu memori utama hanya boleh berada dalam baris cache yang jelas. Memori utama dibahagikan secara bersyarat kepada halaman, saiznya sepadan dengan saiz memori cache. Seni bina pemetaan langsung membayangkan bahawa setiap baris cache hanya boleh memetakan blok yang sepadan dari mana-mana halaman dalam memori utama. Blok dengan bilangan yang sama bagi semua halaman jatuh ke dalam baris cache yang sama. Oleh itu, setiap baris cache dituntut oleh banyak blok memori utama bernombor sama dalam halaman. Satu baris pada satu masa hanya boleh mengandungi salinan salah satu blok ini. Teg ialah nombor halaman yang bloknya menduduki baris cache yang sepadan. Dalam seni bina sedemikian, untuk menentukan sama ada terdapat data dalam cache dengan alamat tertentu, adalah perlu untuk membandingkan bilangan halaman yang alamat ini dimiliki dengan tag baris tersebut dalam direktori memori cache yang sepadan dengan blok pada halaman yang mengandungi alamat yang diberikan, iaitu, anda perlu melakukan hanya satu perbandingan.

Cache dipetakan langsung mempunyai pelaksanaan perkakasan yang paling mudah, kerana cache mempunyai struktur memori konvensional yang boleh ditangani secara langsung dan hanya satu pembanding diperlukan. Oleh itu, cache sedemikian boleh menjadi besar.

Perantaraan antara cache bersekutu sepenuhnya dan cache dipetakan langsung ialah cache set-asosiatif, yang digunakan terutamanya dalam mikropemproses moden. Dalam cache set-asosiatif, tidak seperti cache dipetakan langsung, setiap blok memori utama boleh menuntut salah satu daripada beberapa baris cache yang digabungkan dalam satu set. Ini meningkatkan kemungkinan penukaran yang berjaya. Secara ringkasnya, kita boleh menganggap bahawa cache set-asosiatif ialah beberapa saluran pemetaan langsung yang selari dan diselaraskan di mana baris dengan nombor yang sama membentuk set yang sepadan. Rentetan dail yang mewakili blok memori utama yang diperlukan ditentukan oleh perbandingan teg (seperti dalam cache bersekutu) yang dilakukan secara selari untuk semua saluran cache. Setiap set mempunyai bendera yang berkaitan yang menentukan baris yang ditetapkan untuk digantikan dengan blok baharu sekiranya berlaku kehilangan cache. Calon untuk penggantian biasanya rentetan yang paling lama tidak diakses (algoritma LRU - Paling Kurang Digunakan Baru-baru ini). Ia juga mungkin untuk menggunakan FIFO atau algoritma penggantian rawak, yang lebih mudah tetapi kurang cekap.