summaryrefslogtreecommitdiff
path: root/BS/dpu/task.c
diff options
context:
space:
mode:
Diffstat (limited to 'BS/dpu/task.c')
-rw-r--r--BS/dpu/task.c75
1 files changed, 39 insertions, 36 deletions
diff --git a/BS/dpu/task.c b/BS/dpu/task.c
index 39a340d..acf66f2 100644
--- a/BS/dpu/task.c
+++ b/BS/dpu/task.c
@@ -12,16 +12,17 @@
#include <perfcounter.h>
#include "common.h"
+#define WORD_MASK 0xfffffff8
__host dpu_arguments_t DPU_INPUT_ARGUMENTS;
__host dpu_results_t DPU_RESULTS[NR_TASKLETS];
// Search
-static DTYPE search(DTYPE *bufferA, DTYPE searching_for) {
+static DTYPE search(DTYPE *bufferA, DTYPE searching_for, size_t search_size) {
DTYPE found = -2;
if(bufferA[0] <= searching_for)
{
found = -1;
- for (uint32_t i = 0; i < BLOCK_SIZE / sizeof(DTYPE); i++){
+ for (uint32_t i = 0; i < search_size / sizeof(DTYPE); i++){
if(bufferA[i] == searching_for)
{
found = i;
@@ -78,8 +79,6 @@ int main_kernel1() {
mram_read((__mram_ptr void const *) current_mram_block_addr_query, &searching_for, 8);
current_mram_block_addr_query += 8;
- bool end = false;
-
// Initialize input vector boundaries
start_mram_block_addr_A = (uint32_t) DPU_MRAM_HEAP_POINTER;
start_mram_block_addr_aux = start_mram_block_addr_A;
@@ -91,14 +90,47 @@ int main_kernel1() {
mram_read((__mram_ptr void const *) current_mram_block_addr_A, cache_aux_A, BLOCK_SIZE);
mram_read((__mram_ptr void const *) (end_mram_block_addr_A - BLOCK_SIZE * sizeof(DTYPE)), cache_aux_B, BLOCK_SIZE);
- current_mram_block_addr_A = (start_mram_block_addr_A + end_mram_block_addr_A) / 2;
- while(!end)
+ while(1)
{
+ // Locate the address of the mid mram block
+ current_mram_block_addr_A = (start_mram_block_addr_A + end_mram_block_addr_A) / 2;
+ current_mram_block_addr_A &= WORD_MASK;
+
+ // Boundary check
+ if(current_mram_block_addr_A < (start_mram_block_addr_A + BLOCK_SIZE))
+ {
+ // Search inside (start_mram_block_addr_A, start_mram_block_addr_A + BLOCK_SIZE)
+ mram_read((__mram_ptr void const *) start_mram_block_addr_A, cache_A, BLOCK_SIZE);
+ found = search(cache_A, searching_for, BLOCK_SIZE);
+
+ if(found > -1)
+ {
+ result->found = found + (start_mram_block_addr_A - start_mram_block_addr_aux) / sizeof(DTYPE);
+ }
+ // Search inside (start_mram_block_addr_A + BLOCK_SIZE, end_mram_block_addr_A)
+ else
+ {
+ size_t remain_bytes_to_search = end_mram_block_addr_A - (start_mram_block_addr_A + BLOCK_SIZE);
+ mram_read((__mram_ptr void const *) start_mram_block_addr_A + BLOCK_SIZE, cache_A, remain_bytes_to_search);
+ found = search(cache_A, searching_for, remain_bytes_to_search);
+
+ if(found > -1)
+ {
+ result->found = found + (start_mram_block_addr_A + BLOCK_SIZE - start_mram_block_addr_aux) / sizeof(DTYPE);
+ }
+ else
+ {
+ printf("%lld NOT found\n", searching_for);
+ }
+ }
+ break;
+ }
+
// Load cache with current MRAM block
mram_read((__mram_ptr void const *) current_mram_block_addr_A, cache_A, BLOCK_SIZE);
// Search inside block
- found = search(cache_A, searching_for);
+ found = search(cache_A, searching_for, BLOCK_SIZE);
// If found > -1, we found the searching_for query
if(found > -1)
@@ -111,41 +143,12 @@ int main_kernel1() {
if(found == -2)
{
end_mram_block_addr_A = current_mram_block_addr_A;
- current_mram_block_addr_A = (current_mram_block_addr_A + start_mram_block_addr_A) / 2;
}
// If found == -1, we need to discard left part of the input vector
else if (found == -1)
{
start_mram_block_addr_A = current_mram_block_addr_A;
- current_mram_block_addr_A = (current_mram_block_addr_A + end_mram_block_addr_A) / 2;
- }
-
- // Start boundary check
- if(current_mram_block_addr_A < (start_mram_block_addr_aux + BLOCK_SIZE))
- {
- end = true;
- mram_read((__mram_ptr void const *) current_mram_block_addr_A, cache_A, BLOCK_SIZE);
- found = search(cache_A, searching_for);
-
- if(found > -1)
- {
- end = true;
- result->found = found + (current_mram_block_addr_A - start_mram_block_addr_aux) / sizeof(DTYPE);
- }
- }
-
- // End boundary check
- if(current_mram_block_addr_A > (end_mram_block_addr_A - BLOCK_SIZE))
- {
- end = true;
- mram_read((__mram_ptr void const *) end_mram_block_addr_A - BLOCK_SIZE, cache_A, BLOCK_SIZE);
- found = search(cache_A, searching_for);
-
- if(found > -1)
- {
- result->found = found + (current_mram_block_addr_A - start_mram_block_addr_aux) / sizeof(DTYPE);
- }
}
}
}