<?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%D0%9F_2022</id>
	<title>АОР2/К1П 2022 - Историја измена</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%D0%9F_2022"/>
	<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%9A1%D0%9F_2022&amp;action=history"/>
	<updated>2026-06-04T20:33:24Z</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%D0%9F_2022&amp;diff=6019&amp;oldid=prev</id>
		<title>KockaAdmiralac: /* Решење */ Ovo je rotiralo u obrnutom smeru, sad rotira u dobrom</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%9A1%D0%9F_2022&amp;diff=6019&amp;oldid=prev"/>
		<updated>2023-04-04T14:53:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Решење: &lt;/span&gt; Ovo je rotiralo u obrnutom smeru, sad rotira u dobrom&lt;/span&gt;&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;Верзија на датум 4. април 2023. у 16:53&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;div&gt;                     const int idx4y = n - x - 1;&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;                     const int idx4y = n - x - 1;&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;div&gt;                     const int tmp = mat[idx1y][idx1x];&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;                     const int tmp = mat[idx1y][idx1x];&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;                     mat[idx1y][idx1x] = mat[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx2y&lt;/del&gt;][&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx2x&lt;/del&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;                     mat[idx1y][idx1x] = mat[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx4y&lt;/ins&gt;][&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx4x&lt;/ins&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;                     mat[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx2y&lt;/del&gt;][&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx2x&lt;/del&gt;] = mat[idx3y][idx3x];&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;                     mat[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx4y&lt;/ins&gt;][&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx4x&lt;/ins&gt;] = mat[idx3y][idx3x];&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;                     mat[idx3y][idx3x] = mat[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx4y&lt;/del&gt;][&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx4x&lt;/del&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;                     mat[idx3y][idx3x] = mat[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx2y&lt;/ins&gt;][&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx2x&lt;/ins&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;                     mat[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx4y&lt;/del&gt;][&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx4x&lt;/del&gt;] = tmp;&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;                     mat[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx2y&lt;/ins&gt;][&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;idx2x&lt;/ins&gt;] = tmp;&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;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;&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;/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%D0%9F_2022&amp;diff=6018&amp;oldid=prev</id>
		<title>KockaAdmiralac: K1P 2022, treba još da proverim da li rotateMatrixClockwise zaista radi</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%9A1%D0%9F_2022&amp;diff=6018&amp;oldid=prev"/>
		<updated>2023-04-04T14:28:59Z</updated>

		<summary type="html">&lt;p&gt;K1P 2022, treba još da proverim da li rotateMatrixClockwise zaista radi&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;Поправни први колоквијум 2022. године&amp;#039;&amp;#039;&amp;#039; одржан је 7. маја и трајао је 90 минута. Поставка овог рока у тренутку писања није доступна са странице предмета, али ће вероватно бити у будућности.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Објаснити технику оптимизације рада кеш меморије хардверским довлачењем унапред (&amp;#039;&amp;#039;Hardware Prefetching&amp;#039;&amp;#039;). Дати по један пример програма код кога се могу уочити позитивне негативне стране овог приступа.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Хардверско довлачење унапред функционише, у својој најједноставнијој варијанти, тако што након довлачења једног блока кеша хардвер (процесор/контролер кеш меморије) сам довуче следећи блок из оперативне меморије у кеш, очекујући да ће процесор следеће искоритити тај блок. У својим компликованијим варијантама, хардвер може да ово спроводи тек након &amp;#039;&amp;#039;n&amp;#039;&amp;#039;-тог секвенцијалног довлачења блока из оперативне меморије. У суштини, позитивне стране се могу уочити када је претпоставка да треба довући следећи блок исправна, а негативне када није:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Овде ће се блокови довлачити један за другим, и хардверско довлачење ће нам у томе помоћи.&lt;br /&gt;
for (int i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;
    sum += niz[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Овде ће се прво користити један податак из првог блока, затим из неког петог, па деветог...&lt;br /&gt;
// хардверско довлачење ће сваки пут довлачити погрешан блок унапред, и то може (али не мора)&lt;br /&gt;
// да одмогне.&lt;br /&gt;
for (int x = 0; x &amp;lt; nx; ++x) {&lt;br /&gt;
    for (int y = 0; y &amp;lt; ny; ++y) {&lt;br /&gt;
        sum += mat[y][x];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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-through&amp;#039;&amp;#039; алгоритам за ажурирање садржаја оперативне меморије са &amp;#039;&amp;#039;no write allocated&amp;#039;&amp;#039; политиком довлачења. Користи се LRU алгоритам замене. Величина блока кеш меморије је 64B.&lt;br /&gt;
&lt;br /&gt;
Величина&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; података су: &amp;lt;code&amp;gt;sizeof(int)&amp;lt;/code&amp;gt; = 32 bit, &amp;lt;code&amp;gt;sizeof(bool) = sizeof(char)&amp;lt;/code&amp;gt; = 8 bit, адресе се&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; су ширине 32 бита.&lt;br /&gt;
&lt;br /&gt;
Потребно је написати функцију &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;void rotateMatrixClockwise(int** mat, int n)&amp;lt;/syntaxhighlight&amp;gt;, која ротира квадратну матрицу у смеру казаљке на сату, где је &amp;lt;code&amp;gt;int** mat&amp;lt;/code&amp;gt; показивач на матрицу, а &amp;lt;code&amp;gt;int n&amp;lt;/code&amp;gt; величина матрица (&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; × &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;) где је &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; веће од 0 и дељиво је са 16. Приликом писања програма, обратити пажњу на карактеристике кеш меморије и искорити&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; је тако да приликом извршавања функције буде што мање cache MISS.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Стање матрице пре ротације.&lt;br /&gt;
| 1   || 2   || ⋯ || 15  || 16&lt;br /&gt;
|-&lt;br /&gt;
| 17  || 18  || ⋯ || 31  || 32&lt;br /&gt;
|-&lt;br /&gt;
| ⋮  || ⋮   || ⋱ || ⋮  || ⋮&lt;br /&gt;
|-&lt;br /&gt;
| 225 || 226 || ⋯ || 239 || 240&lt;br /&gt;
|-&lt;br /&gt;
| 241 || 242 || ⋯ || 255 || 256&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Стање матрице после ротације.&lt;br /&gt;
| 241 || 225 || ⋯ || 17  || 1&lt;br /&gt;
|-&lt;br /&gt;
| 242 || 226 || ⋯ || 18  || 2&lt;br /&gt;
|-&lt;br /&gt;
| ⋮  || ⋮   || ⋱ || ⋮  || ⋮&lt;br /&gt;
|-&lt;br /&gt;
| 255 || 239 || ⋯ || 31  || 15&lt;br /&gt;
|-&lt;br /&gt;
| 256 || 240 || ⋯ || 32  || 16&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Идеја алгоритма јесте поделити целу матрицу на четири дела, тако да се из горњег левог елементи премештају у горњи десни, из њега у доњи десни, из њега у доњи леви и на крају назад у горњи леви. Сваки од тих делова затим делимо на блокове од 16 × 16 &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; (сваки од њих заузима 16 блокова кеш меморије), податке копирамо између њих, па пређемо на следећи такав блок. Четири блока од 16 × 16 &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; заузимају &amp;lt;math&amp;gt;4 \cdot 16 \cdot 16 \cdot 4B = 4KiB&amp;lt;/math&amp;gt;, тако да сигурно сви стају у кеш меморију одједном. Са оваквим кеш искоришћењем, повећавање величине блока не би требало да донесе нарочита побољшања у перформансама, јер је кеш већ максимално искоришћен.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void rotateMatrixClockwise(int** mat, int n) {&lt;br /&gt;
    const int nHalf = n &amp;gt;&amp;gt; 1;&lt;br /&gt;
    for (int blockY = 0; (blockY &amp;lt;&amp;lt; 4) &amp;lt; nHalf; ++blockY) {&lt;br /&gt;
        // Померај тренутног блока по Y оси&lt;br /&gt;
        const int offsetY = blockY &amp;lt;&amp;lt; 4;&lt;br /&gt;
        for (int blockX = 0; (blockX &amp;lt;&amp;lt; 4) &amp;lt; nHalf; ++blockX) {&lt;br /&gt;
            // Померај тренутног блока по X оси&lt;br /&gt;
            const int offsetX = blockX &amp;lt;&amp;lt; 4;&lt;br /&gt;
            for (int y = offsetY; y &amp;lt; offsetY + 16 &amp;amp;&amp;amp; y &amp;lt; nHalf; ++y) {&lt;br /&gt;
                for (int x = offsetX; x &amp;lt; offsetX + 16 &amp;amp;&amp;amp; x &amp;lt; nHalf; ++x) {&lt;br /&gt;
                    const int idx1x = x;&lt;br /&gt;
                    const int idx1y = y;&lt;br /&gt;
                    const int idx2x = n - y - 1;&lt;br /&gt;
                    const int idx2y = x;&lt;br /&gt;
                    const int idx3x = n - x - 1;&lt;br /&gt;
                    const int idx3y = n - y - 1;&lt;br /&gt;
                    const int idx4x = y;&lt;br /&gt;
                    const int idx4y = n - x - 1;&lt;br /&gt;
                    const int tmp = mat[idx1y][idx1x];&lt;br /&gt;
                    mat[idx1y][idx1x] = mat[idx2y][idx2x];&lt;br /&gt;
                    mat[idx2y][idx2x] = mat[idx3y][idx3x];&lt;br /&gt;
                    mat[idx3y][idx3x] = mat[idx4y][idx4x];&lt;br /&gt;
                    mat[idx4y][idx4x] = tmp;&lt;br /&gt;
                }&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>