From f6c6846430280d5c5a8e44c7c5318a68211e5a87 Mon Sep 17 00:00:00 2001 From: romenskiy Date: Fri, 20 Jun 2025 19:03:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B0=D1=82=D0=B5=D1=80=D0=BD=20=D0=B8?= =?UTF-8?q?=D0=BD=D0=BA=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BC?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=D0=BF=D0=BE=D1=82=D0=BE=D1=87=D0=B5?= =?UTF-8?q?=D0=BD,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=B0=D1=82=D0=B5=D1=80=D0=BD=D1=8B=20Walking?= =?UTF-8?q?=20Ones=20=D0=B8=20Zeros=20=D0=A2=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE?= =?UTF-8?q?=20=D0=B2=20=D0=B0=D0=B4=D0=BD=D0=BE=D0=BF=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.c | 140 +++++++++++++++++++++++++++++---------------------- multi_tred.h | 68 ++++++++++++++++++++----- 2 files changed, 136 insertions(+), 72 deletions(-) diff --git a/main.c b/main.c index 5d245d4..84c05e8 100644 --- a/main.c +++ b/main.c @@ -25,7 +25,7 @@ #define BLOCK_SIZE (1024ULL*1024ULL*1024ULL*8) uint32_t test_patterns[] = {0x00000000, 0xFFFFFFFF, 0xAAAAAAAA, 0x55555555}; - +int test_list[] = {2}; #define bool unsigned char struct tred_pizdec{ @@ -34,6 +34,7 @@ struct tred_pizdec{ int id; size_t words_start; int return_error; + bool test_tip; }; #include "multi_tred.h" @@ -81,7 +82,58 @@ int parse_ti_flags(int argc, char *argv[], int *t, int *i) { } - +void test_patern(struct tred_pizdec** meta,unsigned long* thread, int tred, size_t words, uint32_t * mem, int* err, int p, int test_tipe){ + if (test_tipe == 1){ + printf("\rЗапушен патерн 0x%08X", test_patterns[p]); + fflush(stdout); + } + else if (test_tipe == 2){ + printf("\rЗапушен патерн инкрементации"); + fflush(stdout); + } + for (bool i = 0;(i != tred); i++){ + meta[i] = malloc(sizeof(struct tred_pizdec)); + meta[i]->id = p; + meta[i]->mem = mem; + meta[i]->words_stop = words/tred*(i+1); + meta[i]->words_start = i * words/tred; + meta[i]->test_tip = test_tipe; + DEBUG_PRINT("words_stop: %zu\n",meta[i]->words_stop); + DEBUG_PRINT("words_start:%zu\n",meta[i]->words_start); + pthread_create(&thread[i], NULL, fill_pattern_multi_tred, (void*)meta[i]); + //pthread_join(thread[i], NULL); + } + for (bool i = 0;(i != tred); i++) + pthread_join(thread[i], NULL); + //fill_pattern(mem, words, test_patterns[p]); + //printf("Жду\n"); + //usleep(10000000); + printf("\r-- Проверяю "); + fflush(stdout); + //int err = check_pattern(mem, words, test_patterns[p]); + + for (bool i = 0;(i != tred); i++){ + meta[i] = malloc(sizeof(struct tred_pizdec)); + meta[i]->id = p; + meta[i]->mem = mem; + meta[i]->words_stop = words/tred*(i+1); + meta[i]->words_start = i * words/tred; + DEBUG_PRINT("words_stop: %zu\n",meta[i]->words_stop); + DEBUG_PRINT("words_start:%zu\n",meta[i]->words_start); + pthread_create(&thread[i], NULL, check_pattern_multi_tred, (void*)meta[i]); + //pthread_join(thread[i], NULL); + } + for (bool i = 0;(i != tred); i++){ + pthread_join(thread[i], NULL); + *err += meta[i]->return_error; + free(meta[i]); + } + if (*err == 0){ + printf("\rOK\n"); + fflush(stdout); + } + else printf("Errors: %d\n", *err); +} int main(int argc, char *argv[]) { if (mlockall(MCL_CURRENT | MCL_FUTURE) != 0) { @@ -105,51 +157,10 @@ int main(int argc, char *argv[]) { printf("iterations: %i\n", iterations); for (;iterations != 0; iterations--){ if (tred != -1){ - // Основные паттерны 0x00000000, 0xFFFFFFFF, 0xAAAAAAAA, 0x55555555 - for (size_t p = 0; p < sizeof(test_patterns)/sizeof(test_patterns[0]); ++p){ - printf("\rЗапушен патерн 0x%08X", test_patterns[p]); - fflush(stdout); - for (bool i = 0;(i != tred); i++){ - meta[i] = malloc(sizeof(struct tred_pizdec)); - meta[i]->id = p; - meta[i]->mem = mem; - meta[i]->words_stop = words/tred*(i+1); - meta[i]->words_start = i * words/tred; - DEBUG_PRINT("words_stop: %zu\n",meta[i]->words_stop); - DEBUG_PRINT("words_start:%zu\n",meta[i]->words_start); - pthread_create(&thread[i], NULL, fill_pattern_multi_tred, (void*)meta[i]); - //pthread_join(thread[i], NULL); - } - for (bool i = 0;(i != tred); i++) - pthread_join(thread[i], NULL); - //fill_pattern(mem, words, test_patterns[p]); - //printf("Жду\n"); - //usleep(10000000); - printf("\r-- Проверяю "); - fflush(stdout); - //int err = check_pattern(mem, words, test_patterns[p]); - - for (bool i = 0;(i != tred); i++){ - meta[i] = malloc(sizeof(struct tred_pizdec)); - meta[i]->id = p; - meta[i]->mem = mem; - meta[i]->words_stop = words/tred*(i+1); - meta[i]->words_start = i * words/tred; - DEBUG_PRINT("words_stop: %zu\n",meta[i]->words_stop); - DEBUG_PRINT("words_start:%zu\n",meta[i]->words_start); - pthread_create(&thread[i], NULL, fill_increment_multi_tred, (void*)meta[i]); - //pthread_join(thread[i], NULL); - } - for (bool i = 0;(i != tred); i++){ - pthread_join(thread[i], NULL); - err += meta[i]->return_error; - free(meta[i]); - } - if (err == 0){ - printf("\rOK\n"); - fflush(stdout); - } - else printf("Errors: %d\n", err); + for (size_t p = 0; p < sizeof(test_patterns)/sizeof(test_patterns[0]); ++p) + test_patern(meta, thread, tred, words, mem, &err, p, 1);// Основные паттерны 0x00000000, 0xFFFFFFFF, 0xAAAAAAAA, 0x55555555 + for (int test_list_id = 0; test_list_id < sizeof(test_list)/sizeof(test_list[0]); ++test_list_id){ + test_patern(meta, thread, tred, words, mem, &err, 0, test_list[test_list_id]); } } else{ @@ -162,22 +173,31 @@ int main(int argc, char *argv[]) { if (err == 0) printf("OK\n"); else printf("Errors: %d\n", err); } + // Инкремент + printf("Запушен патерн инкрементации\n"); + fill_increment(mem, words); + //usleep(10000000); + for (size_t i = 0; i < words; i++) { + if (mem[i] != (uint32_t)i) { + printf("Ошибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, (uint32_t)i, mem[i]); + err++; + if (err > 10) break; + } + } + printf("Запушен патерн Walking Ones\n"); + fill_walking_ones(mem, words); + if (0 == fill_walking_ones_test(mem, words)) + printf("OK\n"); + printf("Запушен патерн Walking Zeros\n"); + fill_walking_zeros(mem, words); + if (0 == fill_walking_zeros_test(mem, words)) + printf("OK\n"); + if (err == 0) printf("OK\n"); + else printf("Errors: %d\n", err); } } - // Инкремент - printf("Запушен патерн инкрементации\n"); - fill_increment(mem, words); - //usleep(10000000); - for (size_t i = 0; i < words; i++) { - if (mem[i] != (uint32_t)i) { - printf("Ошибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, (uint32_t)i, mem[i]); - err++; - if (err > 10) break; - } - } - if (err == 0) printf("OK\n"); - else printf("Errors: %d\n", err); + free(mem); return 0; diff --git a/multi_tred.h b/multi_tred.h index 041d0bf..bd5b55f 100644 --- a/multi_tred.h +++ b/multi_tred.h @@ -13,7 +13,7 @@ int check_pattern(uint32_t *buf, size_t words, uint32_t pattern) { int errors = 0; for (size_t i = 0; i < words; i++) { if (buf[i] != pattern) { - printf("Ошибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, pattern, buf[i]); + printf("\nОшибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, pattern, buf[i]); errors++; if (errors > 10) break; } @@ -23,23 +23,67 @@ int check_pattern(uint32_t *buf, size_t words, uint32_t pattern) { void* fill_pattern_multi_tred(void *arg) { struct tred_pizdec* meta = (struct tred_pizdec*) arg; DEBUG_PRINT("id: 0x%08X\n", test_patterns[meta->id]); - for (size_t i = meta->words_start; i < meta->words_stop; i++) { - meta->mem[i] = test_patterns[meta->id]; + if (meta->test_tip == 1){ + for (size_t i = meta->words_start; i < meta->words_stop; i++) { + meta->mem[i] = test_patterns[meta->id]; + } } - uint32_t mem_2 = meta->mem[meta->words_start]; - DEBUG_PRINT("id_1: 0x%08X\n", meta->mem[meta->words_start]); - DEBUG_PRINT("id_2: 0x%08X\n", mem_2); + return NULL; } -void* fill_increment_multi_tred(void *arg) { +void* check_pattern_multi_tred(void *arg) { struct tred_pizdec* meta = (struct tred_pizdec*) arg; meta->return_error = 0; - for (size_t i = meta->words_start; i < meta->words_stop; i++){ - if (meta->mem[i] != test_patterns[meta->id]) { - printf("Ошибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, test_patterns[meta->id], meta->mem[i]); - meta->return_error++; - if (meta->return_error > 10) break; + if (meta->test_tip == 1){ + for (size_t i = meta->words_start; i < meta->words_stop; i++){ + if (meta->mem[i] != test_patterns[meta->id]) { + printf("\nОшибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, test_patterns[meta->id], meta->mem[i]); + meta->return_error++; + if (meta->return_error > 10) break; + } + } + } + else if (meta->test_tip == 2){ + for (size_t i = meta->words_start; i < meta->words_stop; i++) { + if (meta->mem[i] != (uint32_t)i) { + printf("Ошибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, (uint32_t)i, meta->mem[i]); + meta->return_error++; + if (meta->return_error > 10) break; + } } } return NULL; } + +void fill_walking_ones(uint32_t *mem, size_t words) { + for (size_t i = 0; i < words; i++) { + mem[i] = 1U << (i % 32); + } +} +int fill_walking_ones_test(uint32_t *mem, size_t words) { + int errors = 0; + for (size_t i = 0; i < words; i++) { + if (mem[i] != 1U << (i % 32)){ + printf("\nПиздец\n"); + errors++; + } + } + return errors; +} +void fill_walking_zeros(uint32_t *mem, size_t words) { + for (size_t i = 0; i < words; i++) { + mem[i] = ~(1U << (i % 32)); + } +} +int fill_walking_zeros_test(uint32_t *mem, size_t words) { + int errors = 0; + for (size_t i = 0; i < words; i++) { + if (mem[i] != ~(1U << (i % 32))){ + printf("\nПиздец\n"); + errors++; + } + } + return errors; +} + +