multicore fix
This commit is contained in:
@@ -7,7 +7,7 @@ CFLAGS += -I../../include -I../../../hw/simulate -I../../../runtime
|
||||
#MULTICORE += -DNUM_CLUSTERS=1 -DNUM_CORES=2
|
||||
MULTICORE += -DNUM_CLUSTERS=1 -DNUM_CORES=2 -DL2_ENABLE=0
|
||||
|
||||
DEBUG = 1
|
||||
#DEBUG = 1
|
||||
|
||||
CFLAGS += -fPIC
|
||||
|
||||
@@ -21,6 +21,10 @@ RTL_INCLUDE = -I../../hw/rtl -I../../hw/rtl/libs -I../../hw/rtl/interfaces -I../
|
||||
|
||||
VL_FLAGS += --language 1800-2009 --assert -Wall -Wpedantic $(MULTICORE)
|
||||
|
||||
# Use 64 bytes DRAM blocks
|
||||
CFLAGS += -DGLOBAL_BLOCK_SIZE=64
|
||||
VL_FLAGS += -DGLOBAL_BLOCK_SIZE=64
|
||||
|
||||
# Enable Verilator multithreaded simulation
|
||||
#THREADS ?= $(shell python3 -c 'import multiprocessing as mp; print(max(1, mp.cpu_count() // 2))')
|
||||
#VL_FLAGS += --threads $(THREADS)
|
||||
|
||||
@@ -60,9 +60,7 @@ private:
|
||||
class vx_device {
|
||||
public:
|
||||
vx_device()
|
||||
: is_done_(false)
|
||||
, simulator_(&ram_) {
|
||||
simulator_.reset();
|
||||
: is_done_(false) {
|
||||
thread_ = new std::thread(__thread_proc__, this);
|
||||
mem_allocation_ = vx_dev_caps(VX_CAPS_ALLOC_BASE_ADDR);
|
||||
}
|
||||
@@ -95,7 +93,7 @@ public:
|
||||
|
||||
/*printf("VXDRV: upload %d bytes to 0x%x\n", size, dest_addr);
|
||||
for (int i = 0; i < size; i += 4) {
|
||||
printf("mem-write: 0x%x <- 0x%x\n", dest_addr + i, *(uint32_t*)((uint8_t*)src + src_offset + i));
|
||||
printf("mem-write: 0x%x <- 0x%x\n", uint32_t(dest_addr + i), *(uint32_t*)((uint8_t*)src + src_offset + i));
|
||||
}*/
|
||||
|
||||
ram_.write(dest_addr, asize, (uint8_t*)src + src_offset);
|
||||
@@ -111,7 +109,7 @@ public:
|
||||
|
||||
/*printf("VXDRV: download %d bytes from 0x%x\n", size, src_addr);
|
||||
for (int i = 0; i < size; i += 4) {
|
||||
printf("mem-read: 0x%x -> 0x%x\n", src_addr + i, *(uint32_t*)((uint8_t*)dest + dest_offset + i));
|
||||
printf("mem-read: 0x%x -> 0x%x\n", uint32_t(src_addr + i), *(uint32_t*)((uint8_t*)dest + dest_offset + i));
|
||||
}*/
|
||||
|
||||
return 0;
|
||||
@@ -120,7 +118,9 @@ public:
|
||||
int flush_caches(size_t dev_maddr, size_t size) {
|
||||
|
||||
mutex_.lock();
|
||||
simulator_.attach_ram(&ram_);
|
||||
simulator_.flush_caches(dev_maddr, size);
|
||||
simulator_.attach_ram(nullptr);
|
||||
mutex_.unlock();
|
||||
|
||||
return 0;
|
||||
@@ -130,7 +130,8 @@ public:
|
||||
|
||||
mutex_.lock();
|
||||
simulator_.reset();
|
||||
mutex_.unlock();
|
||||
simulator_.attach_ram(&ram_);
|
||||
mutex_.unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -142,8 +143,14 @@ public:
|
||||
bool is_busy = simulator_.is_busy();
|
||||
mutex_.unlock();
|
||||
|
||||
if (!is_busy || 0 == timeout_sec--)
|
||||
if (!is_busy || 0 == timeout_sec--) {
|
||||
if (!is_busy) {
|
||||
mutex_.lock();
|
||||
simulator_.attach_ram(nullptr);
|
||||
mutex_.unlock();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::seconds(1));
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include <iostream>
|
||||
#include <unistd.h>
|
||||
#include <vortex.h>
|
||||
#include "common.h"
|
||||
|
||||
int test = -1;
|
||||
|
||||
@@ -61,7 +62,7 @@ int run_memcopy_test(vx_buffer_h sbuf,
|
||||
int errors = 0;
|
||||
|
||||
// write sbuf data
|
||||
for (int i = 0; i < 8 * num_blocks; ++i) {
|
||||
for (int i = 0; i < (64 * num_blocks) / 8; ++i) {
|
||||
((uint64_t*)vx_host_ptr(sbuf))[i] = shuffle(i, value);
|
||||
}
|
||||
|
||||
@@ -75,12 +76,12 @@ int run_memcopy_test(vx_buffer_h sbuf,
|
||||
|
||||
// verify result
|
||||
std::cout << "verify result" << std::endl;
|
||||
for (int i = 0; i < 8 * num_blocks; ++i) {
|
||||
for (int i = 0; i < (64 * num_blocks) / 8; ++i) {
|
||||
auto curr = ((uint64_t*)vx_host_ptr(dbuf))[i];
|
||||
auto ref = shuffle(i, value);
|
||||
if (curr != ref) {
|
||||
std::cout << "error @ " << std::hex << (address + 64 * i)
|
||||
<< ": actual " << curr << ", expected " << ref << std::endl;
|
||||
std::cout << "error at 0x" << std::hex << (address + 8 * i)
|
||||
<< ": actual 0x" << curr << ", expected 0x" << ref << std::endl;
|
||||
++errors;
|
||||
}
|
||||
}
|
||||
@@ -101,13 +102,13 @@ int run_kernel_test(vx_device_h device,
|
||||
int errors = 0;
|
||||
|
||||
uint64_t seed = 0x0badf00d40ff40ff;
|
||||
int num_blocks = 4;
|
||||
|
||||
unsigned src_dev_addr = 0x10000000;
|
||||
unsigned dest_dev_addr = 0x20000000;
|
||||
|
||||
int src_dev_addr = DEV_MEM_SRC_ADDR;
|
||||
int dest_dev_addr = DEV_MEM_DST_ADDR;
|
||||
int num_blocks = NUM_BLOCKS;
|
||||
|
||||
// write sbuf data
|
||||
for (int i = 0; i < 8 * num_blocks; ++i) {
|
||||
for (int i = 0; i < (64 * num_blocks) / 8; ++i) {
|
||||
((uint64_t*)vx_host_ptr(sbuf))[i] = shuffle(i, seed);
|
||||
}
|
||||
|
||||
@@ -137,12 +138,12 @@ int run_kernel_test(vx_device_h device,
|
||||
|
||||
// verify result
|
||||
std::cout << "verify result" << std::endl;
|
||||
for (int i = 0; i < 8 * num_blocks; ++i) {
|
||||
for (int i = 0; i < (64 * num_blocks) / 8; ++i) {
|
||||
auto curr = ((uint64_t*)vx_host_ptr(dbuf))[i];
|
||||
auto ref = shuffle(i, seed);
|
||||
if (curr != ref) {
|
||||
std::cout << "error @ " << std::hex << (dest_dev_addr + 64 * i)
|
||||
<< ": actual " << curr << ", expected " << ref << std::endl;
|
||||
std::cout << "error at 0x" << std::hex << (dest_dev_addr + 8 * i)
|
||||
<< ": actual 0x" << curr << ", expected 0x" << ref << std::endl;
|
||||
++errors;
|
||||
}
|
||||
}
|
||||
@@ -174,10 +175,10 @@ int main(int argc, char *argv[]) {
|
||||
RT_CHECK(vx_alloc_shared_mem(device, 4096, &dbuf));
|
||||
|
||||
// run tests
|
||||
/*9if (0 == test || -1 == test) {
|
||||
/*if (0 == test || -1 == test) {
|
||||
std::cout << "run memcopy test" << std::endl;
|
||||
RT_CHECK(run_memcopy_test(sbuf, dbuf, 0x10000000, 0x0badf00d00ff00ff, 1));
|
||||
RT_CHECK(run_memcopy_test(sbuf, dbuf, 0x20000000, 0x0badf00d40ff40ff, 8));
|
||||
RT_CHECK(run_memcopy_test(sbuf, dbuf, DEV_MEM_SRC_ADDR, 0x0badf00d00ff00ff, 1));
|
||||
RT_CHECK(run_memcopy_test(sbuf, dbuf, DEV_MEM_DST_ADDR, 0x0badf00d40ff40ff, 8));
|
||||
}*/
|
||||
|
||||
if (1 == test || -1 == test) {
|
||||
|
||||
8
driver/tests/basic/common.h
Normal file
8
driver/tests/basic/common.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef _COMMON_H_
|
||||
#define _COMMON_H_
|
||||
|
||||
#define DEV_MEM_SRC_ADDR 0x10000000
|
||||
#define DEV_MEM_DST_ADDR 0x20000000
|
||||
#define NUM_BLOCKS 16
|
||||
|
||||
#endif
|
||||
Binary file not shown.
@@ -1,9 +1,20 @@
|
||||
#include <stdint.h>
|
||||
#include "config.h"
|
||||
#include "intrinsics/vx_intrinsics.h"
|
||||
#include "common.h"
|
||||
|
||||
void main() {
|
||||
int64_t* x = (int64_t*)0x10000000;
|
||||
int64_t* y = (int64_t*)0x20000000;
|
||||
for (int i = 0; i < 8 * 4; ++i) {
|
||||
y[i] = x[i];
|
||||
int64_t* x = (int64_t*)DEV_MEM_SRC_ADDR;
|
||||
int64_t* y = (int64_t*)DEV_MEM_DST_ADDR;
|
||||
int num_words = (NUM_BLOCKS * 64) / 8;
|
||||
|
||||
int core_id = vx_core_id();
|
||||
int num_cores = vx_num_cores();
|
||||
int num_words_per_core = num_words / num_cores;
|
||||
|
||||
int offset = core_id * num_words_per_core;
|
||||
|
||||
for (int i = 0; i < num_words_per_core; ++i) {
|
||||
y[offset + i] = x[offset + i];
|
||||
}
|
||||
}
|
||||
@@ -49,7 +49,7 @@ run-ase: $(PROJECT)
|
||||
ASE_LOG=0 LD_LIBRARY_PATH=../../opae/ase:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin -n 16
|
||||
|
||||
run-rtlsim: $(PROJECT)
|
||||
LD_LIBRARY_PATH=../../rtlsim:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin -n 16
|
||||
LD_LIBRARY_PATH=../../rtlsim:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin -n 1
|
||||
|
||||
run-simx: $(PROJECT)
|
||||
LD_LIBRARY_PATH=../../simx:$(LD_LIBRARY_PATH) ./$(PROJECT) -f kernel.bin -n 16
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user