Участник:VolkovNikita94: различия между версиями
м |
|||
Строка 1303: | Строка 1303: | ||
</tab> | </tab> | ||
− | <tab name=" | + | <tab name="Преобразование_фурье"> |
{{#widget:Algoviewer | {{#widget:Algoviewer | ||
− | |url= | + | |url=XML_Fourier/Example_002.html |
|width=1200 | |width=1200 | ||
|height=800 | |height=800 | ||
|border=1 | |border=1 | ||
}} | }} | ||
+ | <br> | ||
+ | <div class="collapser mw-collapsible mw-collapsed" style="width:1200px; overflow:auto;"> | ||
+ | Новая разметка: | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <source lang = "xml"> | ||
+ | <algo> | ||
+ | <params> | ||
+ | <param name = "N" type = "int" value = "3"></param> | ||
+ | </params> | ||
+ | <block id = "0" dims = "2"> | ||
+ | <arg name = "I" val = "1..N"></arg> | ||
+ | <arg name = "J" val = "1..2^N"></arg> | ||
+ | <vertex condition = "(J - 1) % (2^I) < 2^(I - 1)" type = "1"> | ||
+ | <in src = "I - 1, J"></in> | ||
+ | <in src = "I - 1, J + 2^(I -1)"></in> | ||
+ | </vertex> | ||
+ | <vertex condition = "(J - 1) % (2^I) >= 2^(I - 1)" type = "2"> | ||
+ | <in src = "I - 1, J"></in> | ||
+ | <in src = "I - 1, J - 2^(I - 1)"></in> | ||
+ | </vertex> | ||
+ | </block> | ||
+ | </algo> | ||
+ | </source> | ||
+ | </div> | ||
+ | </div> | ||
</tab> | </tab> | ||
</tabs> | </tabs> |
Версия 00:54, 14 июля 2020
Чисто последовательная структура в 2D-представлении (последовательное суммирование)
C++ реализация:
int seqSum(const std::vector<int>& _src)
{
int resSum = 0;
for (int srcId = 0; srcId < _src.size(); ++srcId)
{
resSum += _src[srcId];
}
return resSum;
}
Кодировка в XML:
<?xml version="1.0" encoding="UTF-8"?>
<algograph version="0.0.1">
<algorithm num_ext_params="1" num_groups="2">
<ext_param name="n"/>
<group id="0" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="1">
<and_part id="0"><![CDATA[]]></and_part>
<statement id="0" num_inputs="1">
<input id="0" num_solutions="0"/>
</statement>
</or_part>
</group>
<loop>
<loop>
<group id="1" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="4">
<and_part id="0"><![CDATA[-i1<=-1]]></and_part>
<and_part id="1"><![CDATA[i1<=n]]></and_part>
<and_part id="2"><![CDATA[-i2<=-1]]></and_part>
<and_part id="3"><![CDATA[i2<=n]]></and_part>
<statement id="0" num_inputs="3">
<input id="0" num_solutions="0"/>
<input id="1" num_solutions="3">
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="2">
<altarea num_conditions="5">
<condition><![CDATA[i2-n<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[-i2+2<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1]]></coordinate>
<coordinate><![CDATA[i2-1]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="2">
<altarea num_conditions="5">
<condition><![CDATA[-i2+1<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i1+2<=0]]></condition>
<condition><![CDATA[i2-1<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1-1]]></coordinate>
<coordinate><![CDATA[n]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="0" or_part_id="0" statement_id="0" dimsolut="0">
<altarea num_conditions="5">
<condition><![CDATA[-n+1<=0]]></condition>
<condition><![CDATA[-i2+1<=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[i2-1<=0]]></condition>
<condition><![CDATA[i1-1<=0]]></condition>
</altarea>
</solution>
</input>
<input id="2" num_solutions="0"/>
</statement>
</or_part>
</group>
</loop>
</loop>
</algorithm>
</algograph>
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block dims = "2">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<vertex condition = "(j == 1)" type = "0">
<in src = “i – 1, N”></in>
</vertex>
<vertex condition = "(j > 1)" type = "0">
<in src = “i, j - 1”></in>
</vertex>
</block>
</algo>
Набор одномерных последовательных структур, независимых между собой - 2D вариант
C++ реализация:
void seqParSum(const std::vector<std::vector<int> >& _src, std::vector<int>& _res)
{
if (_src.size() != _res.size())
return;
for (int srcGrpId = 0; srcGrpId < _src.size(); ++srcGrpId)
{
for (int srcElId = 0; srcElId < _src[srcGrpId].size(); ++srcElId )
{
_res[srcGrpId] += _src[srcGrpId][srcElId];
}
}
return;
}
Кодировка в XML:
<?xml version="1.0" encoding="UTF-8"?>
<algograph version="0.0.1">
<algorithm num_ext_params="1" num_groups="2">
<ext_param name="n"/>
<group id="0" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="1">
<and_part id="0"><![CDATA[]]></and_part>
<statement id="0" num_inputs="1">
<input id="0" num_solutions="0"/>
</statement>
</or_part>
</group>
<loop>
<loop>
<group id="1" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="4">
<and_part id="0"><![CDATA[-i1<=-1]]></and_part>
<and_part id="1"><![CDATA[i1<=n]]></and_part>
<and_part id="2"><![CDATA[-i2<=-1]]></and_part>
<and_part id="3"><![CDATA[i2<=n]]></and_part>
<statement id="0" num_inputs="3">
<input id="0" num_solutions="0"/>
<input id="1" num_solutions="3">
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="2">
<altarea num_conditions="5">
<condition><![CDATA[i2-n<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[-i2+2<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1]]></coordinate>
<coordinate><![CDATA[i2-1]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="0">
<altarea num_conditions="5">
<condition><![CDATA[-i2+1<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i1+2<=0]]></condition>
<condition><![CDATA[i2-1<=0]]></condition>
</altarea>
</solution>
<solution num_altareas="1" group_id="0" or_part_id="0" statement_id="0" dimsolut="0">
<altarea num_conditions="5">
<condition><![CDATA[-n+1<=0]]></condition>
<condition><![CDATA[-i2+1<=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[i2-1<=0]]></condition>
<condition><![CDATA[i1-1<=0]]></condition>
</altarea>
</solution>
</input>
<input id="2" num_solutions="0"/>
</statement>
</or_part>
</group>
</loop>
</loop>
</algorithm>
</algograph>
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block dims = "2">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<vertex condition = "" type = "0">
<in src = “i, j - 1”></in>
</vertex>
</block>
</algo>
Двумерная структура со скошенным параллелизмом
C++ реализация:
int accumSum(int** _src, int _nCol, int _nRow)
{
for (int rowId = 0; rowId < _nRow; ++rowId)
{
for (int colId = 0; colId < _nCol; ++colId)
{
_src[rowId][colId] += _src[rowId][colId == 0 ? colId : colId - 1];
_src[rowId][colId] += _src[rowId == 0 ? rowId : rowId - 1][colId];
}
}
return _src[_nRow - 1][_nCol - 1];
}
Кодировка в XML:
<?xml version="1.0" encoding="UTF-8"?>
<algograph version="0.0.1">
<algorithm num_ext_params="1" num_groups="2">
<ext_param name="n"/>
<group id="0" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="1">
<and_part id="0"><![CDATA[]]></and_part>
<statement id="0" num_inputs="1">
<input id="0" num_solutions="0"/>
</statement>
</or_part>
</group>
<loop>
<loop>
<group id="1" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="4">
<and_part id="0"><![CDATA[-i1<=-1]]></and_part>
<and_part id="1"><![CDATA[i1<=n]]></and_part>
<and_part id="2"><![CDATA[-i2<=-1]]></and_part>
<and_part id="3"><![CDATA[i2<=n]]></and_part>
<statement id="0" num_inputs="3">
<input id="0" num_solutions="0"/>
<input id="1" num_solutions="3">
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="2">
<altarea num_conditions="5">
<condition><![CDATA[i2-n<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[-i2+2<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1]]></coordinate>
<coordinate><![CDATA[i2-1]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="2">
<altarea num_conditions="5">
<condition><![CDATA[i2-n<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i1+2<=0]]></condition>
<condition><![CDATA[-i2+1<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1-1]]></coordinate>
<coordinate><![CDATA[i2]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="0" or_part_id="0" statement_id="0" dimsolut="0">
<altarea num_conditions="5">
<condition><![CDATA[-n+1<=0]]></condition>
<condition><![CDATA[-i2+1<=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[i2-1<=0]]></condition>
<condition><![CDATA[i1-1<=0]]></condition>
</altarea>
</solution>
</input>
<input id="2" num_solutions="0"/>
</statement>
</or_part>
</group>
</loop>
</loop>
</algorithm>
</algograph>
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block dims = "2">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<vertex condition = "" type = "0">
<in src = “i, j - 1”></in>
<in src = “i - 1, j”></in>
</vertex>
</block>
</algo>
Двумерная структура со скошенным параллелизмом и скошенной передачей данных
C++ реализация:
int accumSum(int** _src, int _nCol, int _nRow)
{
for (int rowId = 0; rowId < _nRow; ++rowId)
{
for (int colId = 0; colId < _nCol; ++colId)
{
_src[rowId][colId] += _src[(rowId == 0 && colId < 2) ? rowId : rowId - 1][(rowId != 0 && colId > 1) ? colId : colId - 2];
_src[rowId][colId] += _src[rowId == 0 ? rowId : rowId - 1][colId];
}
}
return _src[_nRow - 1][_nCol - 1];
}
Кодировка в XML:
<?xml version="1.0" encoding="UTF-8"?>
<algograph version="0.0.1">
<algorithm num_ext_params="1" num_groups="2">
<ext_param name="n"/>
<group id="0" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="1">
<and_part id="0"><![CDATA[]]></and_part>
<statement id="0" num_inputs="1">
<input id="0" num_solutions="0"/>
</statement>
</or_part>
</group>
<loop>
<loop>
<group id="1" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="4">
<and_part id="0"><![CDATA[-i1<=-1]]></and_part>
<and_part id="1"><![CDATA[i1<=n]]></and_part>
<and_part id="2"><![CDATA[-i2<=-1]]></and_part>
<and_part id="3"><![CDATA[i2<=n]]></and_part>
<statement id="0" num_inputs="3">
<input id="0" num_solutions="0"/>
<input id="1" num_solutions="3">
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="2">
<altarea num_conditions="5">
<condition><![CDATA[i2-n<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[-i2+2<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1]]></coordinate>
<coordinate><![CDATA[i2-1]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="2">
<altarea num_conditions="5">
<condition><![CDATA[i2-n<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i1+3<=0]]></condition>
<condition><![CDATA[-i2+2<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1-2]]></coordinate>
<coordinate><![CDATA[i2-1]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="0" or_part_id="0" statement_id="0" dimsolut="0">
<altarea num_conditions="5">
<condition><![CDATA[-n+1<=0]]></condition>
<condition><![CDATA[-i2+1<=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[i2-1<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
</altarea>
</solution>
</input>
<input id="2" num_solutions="0"/>
</statement>
</or_part>
</group>
</loop>
</loop>
</algorithm>
</algograph>
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block dims = "2">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<vertex condition = "" type = "0">
<in src = “i, j - 1”></in>
<in src = “i - 2, j - 1”></in>
</vertex>
</block>
</algo>
Двумерная структура с квадратным параллелизмом и массовыми рассылками по каждому измерению
C++ реализация:
int accumSum(int** _src, int _nCol, int _nRow)
{
for (int rowId = 0; rowId < _nRow; ++rowId)
{
for (int colId = 0; colId < _nCol; ++colId)
{
_src[rowId][colId] += _src[rowId][colId == 0 ? colId : colId - 1];
_src[rowId][colId] += _src[rowId == 0 ? rowId : rowId - 1][colId];
_src[rowId][colId] += _src[rowId][0];
_src[rowId][colId] += _src[0][colId];
}
}
return _src[_nRow - 1][_nCol - 1];
}
Кодировка в XML:
<?xml version="1.0" encoding="UTF-8"?>
<algograph version="0.0.1">
<algorithm num_ext_params="1" num_groups="2">
<ext_param name="n"/>
<group id="0" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="1">
<and_part id="0"><![CDATA[]]></and_part>
<statement id="0" num_inputs="1">
<input id="0" num_solutions="0"/>
</statement>
</or_part>
</group>
<loop>
<loop>
<group id="1" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="4">
<and_part id="0"><![CDATA[-i1<=-1]]></and_part>
<and_part id="1"><![CDATA[i1<=n]]></and_part>
<and_part id="2"><![CDATA[-i2<=-1]]></and_part>
<and_part id="3"><![CDATA[i2<=n]]></and_part>
<statement id="0" num_inputs="3">
<input id="0" num_solutions="0"/>
<input id="1" num_solutions="5">
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="2">
<altarea num_conditions="5">
<condition><![CDATA[i2-n<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[-i2+2<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1]]></coordinate>
<coordinate><![CDATA[i2-1]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="2">
<altarea num_conditions="5">
<condition><![CDATA[i2-n<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i2+1<=0]]></condition>
<condition><![CDATA[-i1+2<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1-1]]></coordinate>
<coordinate><![CDATA[i2]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="2">
<altarea num_conditions="5">
<condition><![CDATA[i2-n<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[-i2+3<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1]]></coordinate>
<coordinate><![CDATA[1]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="2">
<altarea num_conditions="5">
<condition><![CDATA[i2-n<=0]]></condition>
<condition><![CDATA[-n+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[-i2+1<=0]]></condition>
<condition><![CDATA[-i1+3<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[1]]></coordinate>
<coordinate><![CDATA[i2]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="0" or_part_id="0" statement_id="0" dimsolut="0">
<altarea num_conditions="5">
<condition><![CDATA[-n+1<=0]]></condition>
<condition><![CDATA[-i2+1<=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[i2-1<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
</altarea>
</solution>
</input>
<input id="2" num_solutions="0"/>
</statement>
</or_part>
</group>
</loop>
</loop>
</algorithm>
</algograph>
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block dims = "2">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<vertex condition = "" type = "0">
<in src = “i, j - 1”></in>
<in src = “i - 1, j”></in>
<in src = “1, j”></in>
<in src = “i, 1”></in>
</vertex>
</block>
</algo>
Набор независимых последовательно-параллельных 2D-структур с массовой рассылкой данных в каждой
C++ реализация:
void accumSum(int*** _src, int _nCol, int _nRow, int _nLayer)
{
for (int layerId = 0; layerId < _nLayer; ++layerId)
{
for (int rowId = 0; rowId < _nRow; ++rowId)
{
for (int colId = 0; colId < _nCol; ++colId)
{
_src[layerId][rowId][colId] += _src[layerId][rowId == 0 ? rowId : rowId - 1][colId == 0 ? colId : 0];
_src[layerId][rowId][colId] += _src[layerId][rowId == 0 ? rowId : rowId - 1][colId];
}
}
}
}
Кодировка в XML:
<?xml version="1.0" encoding="UTF-8"?>
<algograph version="0.0.1">
<algorithm num_ext_params="2" num_groups="2">
<ext_param name="n"/>
<ext_param name="m"/>
<group id="0" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="1">
<and_part id="0"><![CDATA[]]></and_part>
<statement id="0" num_inputs="1">
<input id="0" num_solutions="0"/>
</statement>
</or_part>
</group>
<loop>
<loop>
<loop>
<group id="1" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="6">
<and_part id="0"><![CDATA[-i1<=-1]]></and_part>
<and_part id="1"><![CDATA[i1<=n]]></and_part>
<and_part id="2"><![CDATA[-i2<=-1]]></and_part>
<and_part id="3"><![CDATA[i2<=m]]></and_part>
<and_part id="4"><![CDATA[i3>=0]]></and_part>
<and_part id="5"><![CDATA[i3<=n-1]]></and_part>
<input id="0" num_solutions="0"/>
<input id="1" num_solutions="3">
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="3">
<altarea num_conditions="7">
<condition><![CDATA[-m+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[i3-n+1<=0]]></condition>
<condition><![CDATA[-i2+2<=0]]></condition>
<condition><![CDATA[i2<=m]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[-i3<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1]]></coordinate>
<coordinate><![CDATA[i2-1]]></coordinate>
<coordinate><![CDATA[i3]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="3">
<altarea num_conditions="7">
<condition><![CDATA[-m+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[i3-n+1<=0]]></condition>
<condition><![CDATA[-i2+2<=0]]></condition>
<condition><![CDATA[i2<=m]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[-i3<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[1]]></coordinate>
<coordinate><![CDATA[i2-1]]></coordinate>
<coordinate><![CDATA[i3]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="0" or_part_id="0" statement_id="0" dimsolut="0">
<altarea num_conditions="6">
<condition><![CDATA[i2-1<=0]]></condition>
<condition><![CDATA[i2-1>=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[-i3<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[i3-n+1<=0]]></condition>
</altarea>
</solution>
</input>
<input id="2" num_solutions="0"/>
</statement>
</or_part>
</group>
</loop>
</loop>
</loop>
</algorithm>
</algograph>
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block dims = "3">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<arg name = "k" val = "1..N"></arg>
<vertex condition = "" type = "0">
<in src = “i, j – 1, k”></in>
<in src = “1, j - 1, k”></in>
</vertex>
</block>
</algo>
Набор одномерных последовательных структур, независимых между собой - 3D вариант
C++ реализация:
void accumSum(int*** _src, int _nCol, int _nRow, int _nLayer)
{
for (int layerId = 0; layerId < _nLayer; ++layerId)
{
for (int rowId = 0; rowId < _nRow; ++rowId)
{
for (int colId = 0; colId < _nCol; ++colId)
{
_src[layerId][rowId][colId] += _src[layerId][rowId == 0 ? rowId : rowId - 1][colId];
}
}
}
}
Кодировка в XML:
<?xml version="1.0" encoding="UTF-8"?>
<algograph version="0.0.1">
<algorithm num_ext_params="2" num_groups="2">
<ext_param name="n"/>
<ext_param name="m"/>
<group id="0" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="1">
<and_part id="0"><![CDATA[]]></and_part>
<statement id="0" num_inputs="1">
<input id="0" num_solutions="0"/>
</statement>
</or_part>
</group>
<loop>
<loop>
<loop>
<group id="1" num_or_parts="1" num_oper="1">
<or_part id="0" num_and_parts="6">
<and_part id="0"><![CDATA[-i1<=-1]]></and_part>
<and_part id="1"><![CDATA[i1<=n]]></and_part>
<and_part id="2"><![CDATA[-i2<=-1]]></and_part>
<and_part id="3"><![CDATA[i2<=m]]></and_part>
<and_part id="4"><![CDATA[i3>=0]]></and_part>
<and_part id="5"><![CDATA[i3<=n-1]]></and_part>
<statement id="0" num_inputs="3">
<input id="0" num_solutions="0"/>
<input id="1" num_solutions="2">
<solution num_altareas="1" group_id="1" or_part_id="0" statement_id="0" dimsolut="3">
<altarea num_conditions="7">
<condition><![CDATA[-m+2<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[i3-n+1<=0]]></condition>
<condition><![CDATA[-i2+1<=0]]></condition>
<condition><![CDATA[i2+1<=m]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[-i3<=0]]></condition>
</altarea>
<dependency>
<coordinate><![CDATA[i1]]></coordinate>
<coordinate><![CDATA[i2+1]]></coordinate>
<coordinate><![CDATA[i3]]></coordinate>
</dependency>
</solution>
<solution num_altareas="1" group_id="0" or_part_id="0" statement_id="0" dimsolut="0">
<altarea num_conditions="6">
<condition><![CDATA[i2-m<=0]]></condition>
<condition><![CDATA[i2-m>=0]]></condition>
<condition><![CDATA[-i1+1<=0]]></condition>
<condition><![CDATA[-i3<=0]]></condition>
<condition><![CDATA[i1-n<=0]]></condition>
<condition><![CDATA[i3-n+1<=0]]></condition>
</altarea>
</solution>
</input>
<input id="2" num_solutions="0"/>
</statement>
</or_part>
</group>
</loop>
</loop>
</loop>
</algorithm>
</algograph>
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block dims = "3">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<arg name = "k" val = "1..N"></arg>
<vertex condition = "" type = "0">
<in src = “i, j – 1, k”></in>
</vertex>
</block>
</algo>
Пример массовой рассылки данных в 2D-структуре
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block dims = "2">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..2"></arg>
<vertex condition = "(j == 1) && (i == 1)" type = "0">
</vertex>
<vertex condition = "(j > 1)" type = "0">
<in src = “1, 1”></in>
</vertex>
</block>
</algo>
Последовательный набор 3D-структур, содержащих скошенный параллелизм
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block id = "0" dims = "3">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<arg name = "k" val = "1..N"></arg>
<vertex condition = "" type = "0">
<in src = "i - 1, j, k"></in>
<in src = "i, j – 1, k"></in>
<in src = "i, j, k - 1"></in>
</vertex>
</block>
<block id = "1" dims = "3">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..2"></arg>
<arg name = "k" val = "1..N"></arg>
<vertex condition = "" type = "0">
<in bsrc = "0" src = "i, j, k"></in>
<in src = "i - 1, j, k"></in>
<in src = "i, j – 1, k"></in>
<in src = "i, j, k - 1"></in>
</vertex>
</block>
</algo>
Пример массовой рассылки данных в 3D-структуре
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block dims = "3">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<arg name = "k" val = "1..2"></arg>
<vertex condition = "(i == 1) && (j == 1) && (k == 1)" type = "0">
</vertex>
<vertex condition = "(i > 1) && (j > 1) && (k > 1)" type = "0">
<in src = “1, 1, 1”></in>
</vertex>
</block>
</algo>
Пример 3D-структуры с различными видами скошенного параллелизма
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block dims = "3">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<arg name = "k" val = "1..2"></arg>
<vertex condition = "k == 1" type = "0">
<in src = “i, j – 1”></in>
<in src = “i - 1, j”></in>
</vertex>
<vertex condition = "k > 1" type = "0">
<in src = “i, j, 1”></in>
<in src = “i, j – 1”></in>
<in src = “i - 1, j - 1”></in>
</vertex>
</block>
</algo>
Последовательно-параллельное перемножение матриц
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
<param name = "P" type = "int"></param>
<param name = "Q" type = "int"></param>
</params>
<block dims = "3">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..P"></arg>
<arg name = "k" val = "1..Q"></arg>
<vertex condition = "(i > 1) && (j > 1)" type = "0">
<in src = “i, j – 1”></in>
<in src = “i - 1, j”></in>
<in src = “i, j, k -1”></in>
</vertex>
<vertex condition = "(i > 1) || (j > 1)" type = "0">
<in src = “i, j – 1”></in>
<in src = “i - 1, j”></in>
</vertex>
</block>
</algo>
C++ реализация:
for (int i = 1; i <= n; ++i) {
C[i] = C[i - 2];
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
B[i][j] = B[i][j] + C[i];
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
for (int k = 1; k <= n; ++k) {
A[i][j][k] = A[i][j][k] + A[i - 1][j][1];
}
}
}
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block id = "0" dims = "1">
<arg name = "i" val = "1..N"></arg>
<vertex condition = "" type = "0">
<in src = “i – 2”></in>
</vertex>
</block>
<block id = "1" dims = "2">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<vertex condition = "" type = "0">
<in bsrc = "0" src = "i"></in>
</vertex>
</block>
<block id = "2" dims = "3">
<arg name = "i" val = "1..N"></arg>
<arg name = "j" val = "1..N"></arg>
<arg name = "k" val = "1..N"></arg>
<vertex condition = "(k == 1) || (i == 1)" type = "0">
</vertex>
<vertex condition = "(k > 1) && (i > 1)" type = "0">
<in src = “1, j, 1”></in>
</vertex>
</block>
</algo>
C++ реализация:
for (int i = 1; i <= n; ++i) {
C[i] = C[i - 2];
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
B[i][j] = B[i][j] + C[i];
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
for (int k = 1; k <= n; ++k) {
A[i][j][k] = A[i][j][k] + A[i - 1][j][1];
}
}
}
C++ реализация:
for (int i = 1; i <= n; ++i) {
C[i] = C[i] * e;
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
B[i][j] = B[i - 1][j - 1];
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
for (int k = 1; k <= n; ++k) {
A[i][j][k] = A[i][j][k] + A[i][j - 1][k - 2];
}
A[i][j][n] = A[i][j][n] + B[i][j];
}
}
Новая разметка:
<algo>
<params>
<param name = "N" type = "int"></param>
</params>
<block id = "0" dims = "1">
<arg name = "I" val = "1..N"></arg>
<vertex condition = "" type = "1">
</vertex>
</block>
<block id = "0" dims = "2">
<arg name = "I" val = "1..N"></arg>
<arg name = "J" val = "1..N"></arg>
<vertex condition = "" type = "1">
<in src = "I - 1, J - 1"></in>
</vertex>
</block>
<block id = "2" dims = "3">
<arg name = "I" val = "1..N"></arg>
<arg name = "J" val = "1..N"></arg>
<arg name = "K" val = "1..N"></arg>
<vertex condition = "K == 1" type = "2">
<in bsrc = "1" src = "I, J"></in>
<in src = "I - 1, J, K + 2"></in>
</vertex>
<vertex condition = "K > 1" type = "1">
<in src = "I - 1, J, K + 2"></in>
</vertex>
</block>
</algo>
C++ реализация:
for (int i = 1; i <= n; ++i) {
C[i] = C[i] * e;
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
B[i][j] = B[i - 1][j - 1];
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
for (int k = 1; k <= n; ++k) {
A[i][j][k] = A[i][j][k] + A[i][j - 1][k - 2];
}
A[i][j][n] = A[i][j][n] + B[i][j];
}
}
Новая разметка:
<algo>
<params>
<param name = "N" type = "int" value = "3"></param>
</params>
<block id = "0" dims = "2">
<arg name = "I" val = "1..N"></arg>
<arg name = "J" val = "1..2^N"></arg>
<vertex condition = "(J - 1) % (2^I) < 2^(I - 1)" type = "1">
<in src = "I - 1, J"></in>
<in src = "I - 1, J + 2^(I -1)"></in>
</vertex>
<vertex condition = "(J - 1) % (2^I) >= 2^(I - 1)" type = "2">
<in src = "I - 1, J"></in>
<in src = "I - 1, J - 2^(I - 1)"></in>
</vertex>
</block>
</algo>