In preparation to tackle a bigger problem, I decided to code a MitrionC program that does the following:
- reads MEMSIZE numbers from an external memory and writes them to an internal memory (I call these numbers the ‘database’)
- reads 1 number from another external memory (I call this number the ‘query’)
- determine if the query is equal to any of the database numbers.
Attempt #1
Mitrion-C 1.5;
MEMSIZE = 100;
MemElem = typedef int:8;
AttRAM = typedef mem MemElem[MEMSIZE];
(bool ,AttRAM ) main(AttRAM RAM0_it0, AttRAM RAM1_it0)
{
LUT_it0 = _memcreate(mem MemElem[MEMSIZE] LUT_it_last);
LUT_it_last = LUT_it0;
AttRAM LUT_it3 = LUT_it0;
(MemElem list, LUT_it2) =
foreach (i in <0 .. MEMSIZE-1>)
{
d = memread(RAM0_it0, i);
LUT_it1 = memwrite(LUT_it0,d,i);
} (d,LUT_it1);
MemElem query = memread(RAM1_it0, 0);
bool e = false;
(found,LUT_it4)= for (i in <0 .. MEMSIZE-1>) {
//found = for (element in list) {
(element,LUT_it3) = memread(LUT_it2, i);
e = if ( element == query) true else e;
} (e,LUT_it3) ;
} (found, LUT_it4);
Observations:
Too sequential!!
Results:
| MEMSIZE | CYCLES |
| 10 | 79 |
| 20 | 142 |
| 30 | 204 |
| 40 | 267 |
| 100 | 642 |
Attempt #2
Mitrion-C 1.5; /* Given a list of size LISTSIZE determine if it contains duplicates. Version 2. */ LISTSIZE = 10; ElemType = typedef int:8; (bool) main(ElemTypelist) { vector = reformat(list, [LISTSIZE]); comp_list_of_lists = foreach (e,i in list ,<0 .. LISTSIZE-1>) { comp_list = foreach(f,j in vector,[0 .. LISTSIZE-1]) { comp = ( (i!=j) && (f == e)); } comp; } comp_list; gathered_comp_list = foreach (e in comp_list_of_lists) { temp_vector = reformat(e, [LISTSIZE]); bits:LISTSIZE scalar = temp_vector; f = if ((uint:LISTSIZE)scalar != 0) true else false; } f; regathered_comp_list = reformat(gathered_comp_list, [LISTSIZE]); bits:LISTSIZE scalar = regathered_comp_list; bool found = if ((uint:LISTSIZE)scalar != 0) true else false; watch found; } found;
Observations:
Creates MEMSIZE structures in parallel. For example, here’s the resulting structure for MEMSIZE=10.
Results:
| MEMSIZE | CYCLES |
| 10 | 60 |
| 20 | 80 |
| 30 | 100 |
| 100 | 240 |
Attempt #3
Mitrion-C 1.5;
MEMSIZE = 10;
SEARCHSIZE = 10;
MemElem = typedef int:8;
bits:SEARCHSIZE ZERO = 0x000;
AttRAM = typedef mem MemElem[MEMSIZE];
(bool) main(AttRAM RAM0_it0, AttRAM RAM1_it0)
{
// This is the internal memory
LUT_it0 = _memcreate(mem MemElem[MEMSIZE] LUT_it_last);
LUT_it_last = LUT_it0;
AttRAM LUT_it3 = LUT_it0;
// Read from external memory and write to internal LUT
(MemElem list, LUT_it2) =
foreach (i in <0 .. MEMSIZE-1>)
{
d = memread(RAM0_it0, i);
LUT_it1 = memwrite(LUT_it0,d,i);
} (d,LUT_it1);
// Read the query
MemElem query = memread(RAM1_it0, 0);
// Compare query against each element in the DBase
(found_list,LUT_it04) = foreach (i in <0 .. SEARCHSIZE-1>) {
(element, LUT_it3) = memread(LUT_it2, i);
e = if ( element == query) 1 else 0;
}(e, LUT_it3);
bool e = false;
found_vector = reformat(found_list, [SEARCHSIZE]);
watch found_vector;
bits:SEARCHSIZE scalar = found_vector;
bool found = if ((uint:SEARCHSIZE)scalar > 0) true else false;
// recred(found_vector);
watch found;
} (found);
Observations:
????
Results:
| MEMSIZE | CYCLES |
| 10 | 57 |
| 20 | 77 |
| 30 | 99 |
| 100 | 257 |
Attempt #4
Mitrion-C 1.5;
MEMSIZE = 100;
SEARCHSIZE = 100;
MemElem = typedef int:8;
bits:SEARCHSIZE ZERO = 0x000;
AttRAM = typedef mem MemElem[MEMSIZE];
(bool) main(AttRAM RAM0_it0, AttRAM RAM1_it0)
{
// This is the internal memory
LUT_it0 = _memcreate(mem MemElem[MEMSIZE] LUT_it_last);
LUT_it_last = LUT_it0;
AttRAM LUT_it3 = LUT_it0;
// Read from external memory and write to internal LUT
(MemElem list, LUT_it2) =
foreach (i in <0 .. MEMSIZE-1>)
{
d = memread(RAM0_it0, i);
LUT_it1 = memwrite(LUT_it0,d,i);
} (d,LUT_it1);
// Read the query
MemElem query = memread(RAM1_it0, 0);
int:8 i = 0;
bool e = false;
// Compare query against each element in the DBase
(found,LUT_it04) = while ( (e == false) && ( i < SEARCHSIZE) ) {
//found = for (element in list) {
(element, LUT_it3) = memread(LUT_it2, i);
e = if ( element == query) true else false;
i = i + 1;
}(e, LUT_it3);
} (found);
Observations:
The use of while serializes everything. Avoid!
Results:
| MEMSIZE | CYCLES |
| 10 | 164 |
| 20 | 317 |
| 30 | 469 |
| 100 | 1537 |