From c57de94b5c88b5e487eb3dc0d2953f2de98fa14d Mon Sep 17 00:00:00 2001 From: Blaise Tine Date: Sun, 29 Mar 2020 01:17:09 -0400 Subject: [PATCH] minor update --- driver/tests/demo/common.h | 16 ++++------------ driver/tests/demo/demo | Bin 39968 -> 40368 bytes driver/tests/demo/demo.cpp | 36 +++++++++++++++++++++++++---------- driver/tests/demo/kernel.bin | Bin 0 -> 93568 bytes driver/tests/demo/kernel.c | 10 ++++++++-- 5 files changed, 38 insertions(+), 24 deletions(-) create mode 100755 driver/tests/demo/kernel.bin diff --git a/driver/tests/demo/common.h b/driver/tests/demo/common.h index 8241b476..80d2d9ea 100644 --- a/driver/tests/demo/common.h +++ b/driver/tests/demo/common.h @@ -1,23 +1,15 @@ #ifndef _COMMON_H_ #define _COMMON_H_ -#include "../../../runtime/config.h" - -#define MAX_CORES NUMBER_CORES - -#define MAX_WARPS NW - -#define MAX_THREADS NT - -#define BLOCK_SIZE GLOBAL_BLOCK_SIZE_BYTES - #define KERNEL_ARG_DEV_MEM_ADDR 0x7fffff00 struct kernel_arg_t { + uint32_t num_warps; + uint32_t num_threads; + uint32_t stride; uint32_t src0_ptr; uint32_t src1_ptr; - uint32_t dst_ptr; - uint32_t stride; + uint32_t dst_ptr; }; #endif \ No newline at end of file diff --git a/driver/tests/demo/demo b/driver/tests/demo/demo index b9a78efd1f2dae7b28502da978c54176874b42eb..a67bb433d3baa506a3ea11f1bf9f964f2b886003 100755 GIT binary patch delta 15048 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 J)@*P4{{WzA^Zx(< diff --git a/driver/tests/demo/demo.cpp b/driver/tests/demo/demo.cpp index e1b57379..aeaaae84 100644 --- a/driver/tests/demo/demo.cpp +++ b/driver/tests/demo/demo.cpp @@ -5,20 +5,24 @@ #include #include "common.h" -const char* program_file = nullptr; +const char* program_file = "kernel.bin"; +uint32_t data_stride = 0xffffffff; static void show_usage() { std::cout << "Vortex Driver Test." << std::endl; - std::cout << "Usage: -f: program [-h: help]" << std::endl; + std::cout << "Usage: [-f: program] [-n stride] [-h: help]" << std::endl; } static void parse_args(int argc, char **argv) { int c; - while ((c = getopt(argc, argv, "f:h?")) != -1) { + while ((c = getopt(argc, argv, "n:f:h?")) != -1) { switch (c) { - case 'f': { + case 'n': + data_stride = atoi(optarg); + break; + case 'f': program_file = optarg; - } break; + break; case 'h': case '?': { show_usage(); @@ -53,14 +57,24 @@ int main(int argc, char *argv[]) { int errors = 0; size_t value; kernel_arg_t kernel_arg; - - uint32_t stride = BLOCK_SIZE / sizeof(uint32_t); - uint32_t num_points = MAX_CORES * MAX_WARPS * MAX_THREADS * stride; - uint32_t buf_size = num_points * sizeof(uint32_t); // parse command arguments parse_args(argc, argv); + uint32_t block_size = vx_dev_caps(VX_CAPS_CACHE_LINESIZE); + uint32_t max_cores = vx_dev_caps(VX_CAPS_MAX_CORES); + uint32_t max_warps = vx_dev_caps(VX_CAPS_MAX_WARPS); + uint32_t max_threads = vx_dev_caps(VX_CAPS_MAX_THREADS); + + if (data_stride == 0xffffffff) { + data_stride = block_size / sizeof(uint32_t); + } + + uint32_t num_points = max_cores * max_warps * max_threads * data_stride; + uint32_t buf_size = num_points * sizeof(uint32_t); + + std::cout << "number of workitems: " << num_points << std::endl; + // open device connection std::cout << "open device connection" << std::endl; ret = vx_dev_open(&device); @@ -134,7 +148,9 @@ int main(int argc, char *argv[]) { // upload kernel argument std::cout << "upload kernel argument" << std::endl; { - kernel_arg.stride = stride; + kernel_arg.num_warps = max_warps; + kernel_arg.num_threads = max_threads; + kernel_arg.stride = data_stride; auto buf_ptr = (int*)vx_host_ptr(buffer); memcpy(buf_ptr, &kernel_arg, sizeof(kernel_arg_t)); diff --git a/driver/tests/demo/kernel.bin b/driver/tests/demo/kernel.bin new file mode 100755 index 0000000000000000000000000000000000000000..805938925d13abf4f29292bfd48598025a0198c3 GIT binary patch literal 93568 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 + unsigned i = ((wNo * _arg->num_threads) + tid) * _arg->stride; for (unsigned j = 0; j < _arg->stride; ++j) { z[i+j] = x[i+j] * y[i+j]; @@ -22,5 +22,11 @@ void kernel_body(void* arg) { void main() { struct kernel_arg_t* arg = (struct kernel_arg_t*)KERNEL_ARG_DEV_MEM_ADDR; - vx_spawnWarps(MAX_WARPS, MAX_THREADS, kernel_body, arg); + /*printf("num_warps=%d\n", arg->num_warps); + printf("num_threads=%d\n", arg->num_threads); + printf("stride=%d\n", arg->stride); + printf("src0_ptr=0x%x\n", arg->src0_ptr); + printf("src1_ptr=0x%x\n", arg->src1_ptr); + printf("dst_ptr=0x%x\n", arg->dst_ptr);*/ + vx_spawnWarps(arg->num_warps, arg->num_threads, kernel_body, arg); } \ No newline at end of file