From 3a8fbfd762b2d1e5ba12d5791fcab8b081789387 Mon Sep 17 00:00:00 2001 From: nihonium Date: Mon, 14 Mar 2022 22:08:02 +0300 Subject: [PATCH] cpu full --- cpu/cuda.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++ cpu/pdp_rw.c | 46 +++++++++++++++++++++++++++++++++++++ cpu/simple_page.c | 27 ++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 cpu/cuda.c create mode 100644 cpu/pdp_rw.c create mode 100644 cpu/simple_page.c diff --git a/cpu/cuda.c b/cpu/cuda.c new file mode 100644 index 0000000..4704943 --- /dev/null +++ b/cpu/cuda.c @@ -0,0 +1,58 @@ +#include +#include +#define THR 32 +#define MEM 128 +#define REG 2 +#define MAXTHR 1536 +#define MAXMEM 49152 +#define MAXREG 32768 + + +int check_use(int x, const int frac); + +int main() { + int reg, thr, mem; + int nbreg, nbmem, nbthr; + int nthr; + int min = 0; + + freopen("cuda.in", "r", stdin); +#ifndef _DEBUG + freopen("cuda.out", "w", stdout); +#endif + scanf("%d %d %d", &thr, ®, &mem); + + nthr = check_use(thr, THR); + nbthr = (int) MAXTHR / nthr; + nbreg = (int) MAXREG / (nthr*check_use(reg, REG)); + nbmem = (int) MAXMEM / check_use(mem, MEM); + + + if ((nbthr <= nbreg) && (nbthr <= nbmem)) + min = nbthr; + else if ((nbreg <= nbthr) && (nbreg <= nbmem)) + min = nbreg; + else if ((nbmem <= nbthr) && (nbmem <= nbreg)) + min = nbmem; +#ifdef _DEBUG + printf("used: %d %d %d\n", check_use(thr, THR), nthr*check_use(reg, REG), check_use(mem, MEM)); + printf("By threads: %d, by registers: %d, by memory: %d\n", nbthr, nbreg, nbmem); +#endif + printf("%d", (int)round((thr*min*100)/(double)MAXTHR)); + return 0; +} + +int check_use(int x, const int frac) { + int real_x = frac; + while (1) { + real_x += frac; + if (real_x >= x) { + x = real_x; + break; + } + } +#ifdef _DEBUG + printf("%d %d\n", x, real_x); +#endif + return x; +} diff --git a/cpu/pdp_rw.c b/cpu/pdp_rw.c new file mode 100644 index 0000000..5274d3a --- /dev/null +++ b/cpu/pdp_rw.c @@ -0,0 +1,46 @@ +#include +#include +typedef uint8_t byte; +typedef uint16_t word; +typedef uint16_t adr; + +byte mem[1 << 16]; + +byte b_read (adr a) { + return mem[a]; +} +void b_write (adr a, byte val) { + mem[a] = val; +} +word w_read (adr a) { + return *(word*)&mem[a]; +} +void w_write (adr a, word val) { + *(word*)&mem[a] = val; +} +void load_file() { + adr a; + int n, i; + byte x; + + while(scanf("%hx %x", &a, &n) != EOF) { + //printf("%x", n); + for (i = 0; i < n; ++i) { + //printf("number %d\n", i); + scanf("%hhx", &x); + b_write(a+i, x); + //printf("Read %hx\n", mem[a+2*i]); + } + } +} + +void mem_dump(adr start, word n) { + for (int i = 0; i < n; i+=2) { + //printf("%d:read from %hx: %hx\n", i,start+i, *(word*)&mem[start+i]); + printf("%06ho : %06ho\n", start+i, *(word*)&mem[start+i]); + } +} +//int main() { +// load_file(); +// mem_dump(0x40, 4); +//} diff --git a/cpu/simple_page.c b/cpu/simple_page.c new file mode 100644 index 0000000..e04de79 --- /dev/null +++ b/cpu/simple_page.c @@ -0,0 +1,27 @@ +#include +#include + +int main() { + unsigned N, i, page_n, log; + + scanf("%u", &N); + unsigned *mem = (unsigned*)calloc(N, sizeof(unsigned)); + for (i = 0; i < N; ++i) { + scanf("%x", &mem[i]); + } + + scanf("%x", &log); + page_n = (log >> 26) & 0b111111; + if (page_n < N) { + printf("%x", mem[page_n]+(log << 6 >> 6)); + } + else { + printf("error"); + } + + + free(mem); + return 0; + + +}