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 b9a78efd..a67bb433 100755 Binary files a/driver/tests/demo/demo and b/driver/tests/demo/demo differ 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 00000000..80593892 Binary files /dev/null and b/driver/tests/demo/kernel.bin differ diff --git a/driver/tests/demo/kernel.c b/driver/tests/demo/kernel.c index 2c3b555b..130d6872 100644 --- a/driver/tests/demo/kernel.c +++ b/driver/tests/demo/kernel.c @@ -13,7 +13,7 @@ void kernel_body(void* arg) { unsigned wNo = vx_warpNum(); unsigned tid = vx_threadID(); - unsigned i = ((wNo * MAX_THREADS) + tid) * _arg->stride; + 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