<?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_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_2022"/>
	<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%9A1_2022&amp;action=history"/>
	<updated>2026-06-04T05:54:46Z</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_2022&amp;diff=6015&amp;oldid=prev</id>
		<title>KockaAdmiralac: K1 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%9A1_2022&amp;diff=6015&amp;oldid=prev"/>
		<updated>2023-04-04T12:05:31Z</updated>

		<summary type="html">&lt;p&gt;K1 2022&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; одржан је 31. марта и трајао је 90 минута. Поставка овог рока у тренутку писања није доступна са странице предмета, али ће вероватно бити у будућности.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Објаснити технику оптимизације рада кеш меморије која користи предвиђање пута (&amp;#039;&amp;#039;Way Prediction&amp;#039;&amp;#039;). Шта је потребно да постоји код процесора и код кеш меморије да би дата техника могла да се примени.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;#039;&amp;#039;Way Prediction&amp;#039;&amp;#039; подразумева да је наша кеш меморија сет-асоцијативна. Стога, блок се у кеш меморији може пронаћи у једној од више банки кеша, а тачан податак ће бити пропуштен кроз један мултиплексер када се одреди у којој банци се он налази. Оно што нам &amp;#039;&amp;#039;Way Prediction&amp;#039;&amp;#039; омогућава јесте да ми кроз тај мултиплексер пропустимо податак из једне банке за коју смо претходно одредили да се у њој највероватније налази податак. Са довољно добрим алгоритмом предвиђања, губици при погрешном предвиђању бивају надјачани добицима при тачном.&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Потребно је делове датог програма оптимизовати. Програм учитава низ логова (&amp;lt;code&amp;gt;Log[]&amp;lt;/code&amp;gt;) и смешта их у меморију. Сматрати да је почетна адреса низа за чување логова поравната са блоком кеша. Над низом примењује се метода &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;int communicationUntilCount(const Log[] logs, int n, const char[] IP, int time)&amp;lt;/syntaxhighlight&amp;gt;. Метода враћа број логова у којој учествује рачунар са задатом IP адресом до задатог времена (&amp;lt;code&amp;gt;int time&amp;lt;/code&amp;gt;). Низ логова дужине &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;int n&amp;lt;/code&amp;gt;) је задат параметром &amp;lt;code&amp;gt;const Log[] logs&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&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 бита. Програм се извршава на процесору који поседује кеш меморију чија је величина блока 64 бита. Остале карактерситике&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; кеш меморије нису доступне.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Трансформисати методу &amp;lt;code&amp;gt;communicationUntilCount&amp;lt;/code&amp;gt; коришћењем &amp;#039;&amp;#039;Loop fusion&amp;#039;&amp;#039; начина оптимизације кода.&lt;br /&gt;
# Преправити решење под а) предлагањем нове структуре података прилагођене за бољу искоришћеност кеш меморије не мењајући потпис методе &amp;lt;code&amp;gt;communicationUntilCount&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Преправити решење под а) предлагањем нове структуре података прилагођене за бољу искоришћеност кеш меморије при чему је дозвољено мењање потписа методе &amp;lt;code&amp;gt;communicationUntilCount&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct PC {&lt;br /&gt;
    char IP[4];&lt;br /&gt;
    char* hostname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Log {&lt;br /&gt;
    int code;&lt;br /&gt;
    char type;&lt;br /&gt;
    PC* from;&lt;br /&gt;
    PC* to;&lt;br /&gt;
    char severity;&lt;br /&gt;
    int time;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int communicationUntilCount(const Log logs[], int n, const char IP[], int time) {&lt;br /&gt;
    int cnt = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        bool ok = logs[i].time &amp;lt; time;&lt;br /&gt;
        for (int j = 0; j &amp;lt; 3 &amp;amp;&amp;amp; ok; j++) {&lt;br /&gt;
            ok &amp;amp;= logs[i].from-&amp;gt;IP[j] == IP[j];&lt;br /&gt;
        }&lt;br /&gt;
        if (ok) {&lt;br /&gt;
            cnt++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        bool ok = logs[i].time &amp;lt; time;&lt;br /&gt;
        for (int j = 0; j &amp;lt; 3; j++) {&lt;br /&gt;
            ok &amp;amp;= logs[i].to-&amp;gt;IP[j] == IP[j];&lt;br /&gt;
        }&lt;br /&gt;
        if (ok) {&lt;br /&gt;
            cnt++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return cnt;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Након &amp;#039;&amp;#039;Loop fusion&amp;#039;&amp;#039; добијамо следећи код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct PC {&lt;br /&gt;
    char IP[4];&lt;br /&gt;
    char* hostname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Log {&lt;br /&gt;
    int code;&lt;br /&gt;
    char type;&lt;br /&gt;
    PC* from;&lt;br /&gt;
    PC* to;&lt;br /&gt;
    char severity;&lt;br /&gt;
    int time;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int communicationUntilCount(const Log logs[], int n, const char IP[], int time) {&lt;br /&gt;
    int cnt = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        bool ok = logs[i].time &amp;lt; time;&lt;br /&gt;
        for (int j = 0; j &amp;lt; 3 &amp;amp;&amp;amp; ok; j++) {&lt;br /&gt;
            // Претпоставка: from и to никада неће бити исти (јер то нема много смисла).&lt;br /&gt;
            ok &amp;amp;= (logs[i].from-&amp;gt;IP[j] == IP[j]) | (logs[i].to-&amp;gt;IP[j] == IP[j]);&lt;br /&gt;
        }&lt;br /&gt;
        if (ok) {&lt;br /&gt;
            cnt++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return cnt;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Log&amp;lt;/code&amp;gt; структуру података можемо преуредити на следећи начин, тако што податке који нису релевантни за дату методу одвојимо у нову структуру која не мора бити чувана заједно са осталим подацима:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct LogMisc {&lt;br /&gt;
    int code;&lt;br /&gt;
    char type;&lt;br /&gt;
    char severity;&lt;br /&gt;
    char* fromHostname;&lt;br /&gt;
    char* toHostname;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Log {&lt;br /&gt;
    // B0: 4 * 8 = 32bit&lt;br /&gt;
    char fromIP[4];&lt;br /&gt;
    // B0: 4 * 8 = 32bit&lt;br /&gt;
    char toIP[4];&lt;br /&gt;
    // B1: 32bit&lt;br /&gt;
    int time;&lt;br /&gt;
    // B1: 32bit&lt;br /&gt;
    LogMisc* misc;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int communicationUntilCount(const Log logs[], int n, const char IP[], int time) {&lt;br /&gt;
    int cnt = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        bool ok = logs[i].time &amp;lt; time;&lt;br /&gt;
        for (int j = 0; j &amp;lt; 3 &amp;amp;&amp;amp; ok; j++) {&lt;br /&gt;
            ok &amp;amp;= (logs[i].fromIP[j] == IP[j]) | (logs[i].toIP[j] == IP[j]);&lt;br /&gt;
        }&lt;br /&gt;
        if (ok) {&lt;br /&gt;
            cnt++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return cnt;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На овај начин, уместо четири блока кеша (један за &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;to&amp;lt;/code&amp;gt; показиваче, један за &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;, и два за сваку &amp;lt;code&amp;gt;PC&amp;lt;/code&amp;gt; структуру) регуларно довлачимо два блока по логу (један за &amp;lt;code&amp;gt;fromIP&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;toIP&amp;lt;/code&amp;gt; и један за &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Уколико би нам било дозвољено преуређивање потписа методе, могли бисмо да одвојимо &amp;lt;code&amp;gt;fromIP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;toIP&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt; у одвојене низове који се прослеђују као одвојени аргументи:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int communicationUntilCount(const char fromIPs[], const char toIPs[], const int times[], const char IP[], int n, int time) {&lt;br /&gt;
    int cnt = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        bool ok = times[i] &amp;lt; time;&lt;br /&gt;
        for (int j = 0; j &amp;lt; 3 &amp;amp;&amp;amp; ok; j++) {&lt;br /&gt;
            ok &amp;amp;= (fromIPs[(i &amp;lt;&amp;lt; 2) + j] == IP[j]) | (toIPs[(i &amp;lt;&amp;lt; 2) + j] == IP[j]);&lt;br /&gt;
        }&lt;br /&gt;
        if (ok) {&lt;br /&gt;
            cnt++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return cnt;&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>