Патерн инкрементация теперь многопоточен, добавлены патерны Walking Ones и Zeros Только в аднопоток

This commit is contained in:
romenskiy 2025-06-20 19:03:08 +03:00
parent 5ff2c1757e
commit f6c6846430
2 changed files with 136 additions and 72 deletions

140
main.c
View file

@ -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;

View file

@ -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;
}