<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sr">
	<id>https://siwiki.rs/w/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D0%9E%D0%A02%2F%D0%9A1_2023</id>
	<title>АОР2/К1 2023 - Историја измена</title>
	<link rel="self" type="application/atom+xml" href="https://siwiki.rs/w/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D0%9E%D0%A02%2F%D0%9A1_2023"/>
	<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%9A1_2023&amp;action=history"/>
	<updated>2026-06-04T08:16:18Z</updated>
	<subtitle>Историја измена ове странице на пројекту</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%9A1_2023&amp;diff=6067&amp;oldid=prev</id>
		<title>KockaAdmiralac: 8 * 16 * 8 / 64 = 16</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%9A1_2023&amp;diff=6067&amp;oldid=prev"/>
		<updated>2023-04-11T21:39:59Z</updated>

		<summary type="html">&lt;p&gt;8 * 16 * 8 / 64 = 16&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;sr&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Старија измена&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Верзија на датум 11. април 2023. у 23:39&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l78&quot;&gt;Ред 78:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ред 78:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Решење ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Решење ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Слика димензија 8x16 стаје цела у кеш меморију величине 512KiB, па пошто је један блок 64B а &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; тип податка 64 бита значи да ће бити &amp;lt;math&amp;gt;\frac{8 \cdot 16 \cdot 8B}{64B} = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;8&lt;/del&gt;&amp;lt;/math&amp;gt; промашаја.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Слика димензија 8x16 стаје цела у кеш меморију величине 512KiB, па пошто је један блок 64B а &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; тип податка 64 бита значи да ће бити &amp;lt;math&amp;gt;\frac{8 \cdot 16 \cdot 8B}{64B} = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;16&lt;/ins&gt;&amp;lt;/math&amp;gt; промашаја.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;За довољно велике матрице, може се десити да овај алгоритам избаци кеш линије из прва три реда при преласку у следећи и затим мора поново да их довлачи. Техника оптимизације за рад кеш меморије коју овде можемо да применимо јесте &amp;#039;&amp;#039;blocking&amp;#039;&amp;#039;, тако да нам у наших 512KiB кеш меморије стану три реда матрице &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt; и један ред матрице &amp;lt;code&amp;gt;edges&amp;lt;/code&amp;gt;. То значи да један такав ред може да буде &amp;lt;math&amp;gt;\frac{512KiB}{4 \cdot 8B} = 2^{14}&amp;lt;/math&amp;gt; &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; података дугачак.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;За довољно велике матрице, може се десити да овај алгоритам избаци кеш линије из прва три реда при преласку у следећи и затим мора поново да их довлачи. Техника оптимизације за рад кеш меморије коју овде можемо да применимо јесте &amp;#039;&amp;#039;blocking&amp;#039;&amp;#039;, тако да нам у наших 512KiB кеш меморије стану три реда матрице &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt; и један ред матрице &amp;lt;code&amp;gt;edges&amp;lt;/code&amp;gt;. То значи да један такав ред може да буде &amp;lt;math&amp;gt;\frac{512KiB}{4 \cdot 8B} = 2^{14}&amp;lt;/math&amp;gt; &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; података дугачак.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>KockaAdmiralac</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%9A1_2023&amp;diff=6066&amp;oldid=prev</id>
		<title>KockaAdmiralac: Naš kolokvijum od četvrtka</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%9A1_2023&amp;diff=6066&amp;oldid=prev"/>
		<updated>2023-04-11T21:13:55Z</updated>

		<summary type="html">&lt;p&gt;Naš kolokvijum od četvrtka&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Први колоквијум 2023. године&amp;#039;&amp;#039;&amp;#039; одржан је 6. априла и трајао је 75 минута (након што је професор Захарије померио време за 15 минута).&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се кеш меморија реализована у техници сет асоцијативног пресликавања са 4 улаза по сету која користи SIDE алгоритам замене. Објаснити овај алгоритам.&lt;br /&gt;
&lt;br /&gt;
Дати садржаје свих улаза &amp;#039;&amp;#039;TAG&amp;#039;&amp;#039; дела кеш меморије после сваког приступа уколико се обављају приступи меморији за исти сет који имају следеће вредности поља Tag: 0, 1, 2, 1, 2, 5, 4, 2, 3, 6, 3.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
SIDE алгоритам замене садржи један показивач по сету који показује на следећи блок за замену. Лево од тог блока је заштићен сегмент, а десно угрожен. Када се деси &amp;#039;&amp;#039;hit&amp;#039;&amp;#039;, уколико се он десио у угроженом сегменту, показивач се поставља десно од места на ком се десио. Када се деси &amp;#039;&amp;#039;miss&amp;#039;&amp;#039;, замењује се блок на који показује показивач, а показивач се затим инкрементира.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Блокови у сету током времена са показивачем.&lt;br /&gt;
! &amp;#039;&amp;#039;Tag&amp;#039;&amp;#039; !! 0   !! 1   !! 2   !! 3   !! Резултат&lt;br /&gt;
|-&lt;br /&gt;
| 0       || 0   || →   ||     ||     || MISS&lt;br /&gt;
|-&lt;br /&gt;
| 1       || 0   || 1   || →   ||     || MISS&lt;br /&gt;
|-&lt;br /&gt;
| 2       || 0   || 1   || 2   || →   || MISS&lt;br /&gt;
|-&lt;br /&gt;
| 1       || 0   || 1   || 2   || →   || HIT&lt;br /&gt;
|-&lt;br /&gt;
| 2       || 0   || 1   || 2   || →   || HIT&lt;br /&gt;
|-&lt;br /&gt;
| 5       || → 0 || 1   || 2   || 5   || MISS&lt;br /&gt;
|-&lt;br /&gt;
| 4       || 4   || → 1 || 2   || 5   || MISS&lt;br /&gt;
|-&lt;br /&gt;
| 2       || 4   || 1   || 2   || → 5 || HIT&lt;br /&gt;
|-&lt;br /&gt;
| 3       || → 4 || 1   || 2   || 3   || MISS&lt;br /&gt;
|-&lt;br /&gt;
| 6       || 6   || → 1 || 2   || 3   || MISS&lt;br /&gt;
|-&lt;br /&gt;
| 3       || → 6 || 1   || 2   || 3   || HIT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
У процесору се налази &amp;#039;&amp;#039;L1 Data&amp;#039;&amp;#039; асоцијативна кеш меморија величине 512KiB, која користи &amp;#039;&amp;#039;write-back&amp;#039;&amp;#039; алгоритам за ажурирање садржаја оперативне меморије са &amp;#039;&amp;#039;write allocated&amp;#039;&amp;#039; политиком довлачења. Користи се LRU алгоритам замене. Величина блока кеш меморије је 64B.&lt;br /&gt;
&lt;br /&gt;
Дат је програм који коришћењем Собеловог филтера проналази све ивице на задатој слици. У матрици &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt; се налазе реалне вредности типа &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; (ширине 64 бита) које представљају боју пиксела оригиналне слике (слика је дата као палета сивих боја). Матрица &amp;lt;code&amp;gt;edges&amp;lt;/code&amp;gt; представља резултујућу слику у којој су све ивице обојене белом бојом, док је остатак слике црн. Претпоставити да ниједна матрица на почетку није учитана у кеш меморију, као и да су прве ћелије поравнате са блоком кеш меморије. Матрице су смештене по редовима и истих су димензија.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
void sobel ( double *image, int rows, int columns, double *edges ) {&lt;br /&gt;
    int GX[] = { -1, 0, 1, -2, 0, 2, -1, 0, 1 };&lt;br /&gt;
    int GY[] = { -1, -2, -1, 0, 0, 0, 1, 2, 1 };&lt;br /&gt;
&lt;br /&gt;
    for ( int row = 1; row &amp;lt; ( rows - 1 ); ++row ) {&lt;br /&gt;
        for ( int column = 1; column &amp;lt; ( columns - 1 ); ++column ) {&lt;br /&gt;
            double gx = 0;&lt;br /&gt;
            double gy = 0;&lt;br /&gt;
&lt;br /&gt;
            for ( int i = 0; i &amp;lt; 3; ++i ) {&lt;br /&gt;
                for ( int j = 0; j &amp;lt; 3; ++j ) {&lt;br /&gt;
                    int image_row    = row + i - 1;&lt;br /&gt;
                    int image_column = column + j - 1;&lt;br /&gt;
&lt;br /&gt;
                    double image_value = image[image_row * columns + image_column];&lt;br /&gt;
&lt;br /&gt;
                    int kernel_index = i * 3 + j;&lt;br /&gt;
&lt;br /&gt;
                    gx += image_value * GX[kernel_index];&lt;br /&gt;
                    gy += image_value * GY[kernel_index];&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            edges[row * columns + column] = sqrt ( gx * gx + gy * gy );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Уколико се зна да је оригинална слика димезија&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; 8x16, наћи број промашаја приликом приступа кеш меморији. Узети у обзир само промашаје чији је узрок приступ матрици &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Потребно је оптимизовати дати код тако да се резултат програма не промени, а да се при томе искористе карактеристике дате кеш меморије. Није дозвољено коришћење наменских инструкција за манипулацијом кеш меморије. У програму је доступно за коришћење још 5 регистара опште намене.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Слика димензија 8x16 стаје цела у кеш меморију величине 512KiB, па пошто је један блок 64B а &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; тип податка 64 бита значи да ће бити &amp;lt;math&amp;gt;\frac{8 \cdot 16 \cdot 8B}{64B} = 8&amp;lt;/math&amp;gt; промашаја.&lt;br /&gt;
&lt;br /&gt;
За довољно велике матрице, може се десити да овај алгоритам избаци кеш линије из прва три реда при преласку у следећи и затим мора поново да их довлачи. Техника оптимизације за рад кеш меморије коју овде можемо да применимо јесте &amp;#039;&amp;#039;blocking&amp;#039;&amp;#039;, тако да нам у наших 512KiB кеш меморије стану три реда матрице &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt; и један ред матрице &amp;lt;code&amp;gt;edges&amp;lt;/code&amp;gt;. То значи да један такав ред може да буде &amp;lt;math&amp;gt;\frac{512KiB}{4 \cdot 8B} = 2^{14}&amp;lt;/math&amp;gt; &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; података дугачак.&lt;br /&gt;
&lt;br /&gt;
Поред тога, можемо да урадимо &amp;#039;&amp;#039;loop unrolling&amp;#039;&amp;#039; петље која множи са матрицама &amp;lt;code&amp;gt;GX&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;GY&amp;lt;/code&amp;gt;, и тиме и њих уклонимо, као и да сместимо неке често коришћене променљиве у регистре. Дати код затим испада овако:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
const int BLOCK_SIZE = 16384;&lt;br /&gt;
void sobel(double *image, const int rows, const int columns, double *edges) {&lt;br /&gt;
    for (register int block = 0; block &amp;lt; columns / BLOCK_SIZE; ++block) {&lt;br /&gt;
        for (register int row = 1; row &amp;lt; rows - 1; ++row) {&lt;br /&gt;
            for (register int column = block * BLOCK_SIZE; column &amp;lt; columns - 1 &amp;amp;&amp;amp; column &amp;lt; (block + 1) * BLOCK_SIZE; ++column) {&lt;br /&gt;
                const double gx = -1 * image[(row - 1) * columns + (column - 1)] +&lt;br /&gt;
                                   1 * image[(row - 1) * columns + (column + 1)] +&lt;br /&gt;
                                  -2 * image[(row - 0) * columns + (column - 1)] +&lt;br /&gt;
                                   2 * image[(row - 0) * columns + (column + 1)] +&lt;br /&gt;
                                  -1 * image[(row + 1) * columns + (column - 1)] +&lt;br /&gt;
                                   1 * image[(row + 1) * columns + (column + 1)];&lt;br /&gt;
                const double gy = -1 * image[(row - 1) * columns + (column - 1)] +&lt;br /&gt;
                                  -2 * image[(row - 1) * columns + (column - 0)] +&lt;br /&gt;
                                  -1 * image[(row - 1) * columns + (column + 1)] +&lt;br /&gt;
                                   1 * image[(row + 1) * columns + (column - 1)] +&lt;br /&gt;
                                   2 * image[(row + 1) * columns + (column - 0)] +&lt;br /&gt;
                                   1 * image[(row + 1) * columns + (column + 1)];&lt;br /&gt;
                edges[row * columns + column] = sqrt(gx * gx + gy * gy);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АОР2]]&lt;/div&gt;</summary>
		<author><name>KockaAdmiralac</name></author>
	</entry>
</feed>