Патерн инкрементация теперь многопоточен, добавлены патерны Walking Ones и Zeros Только в аднопоток
This commit is contained in:
parent
5ff2c1757e
commit
f6c6846430
2 changed files with 136 additions and 72 deletions
140
main.c
140
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;
|
||||
|
|
|
|||
68
multi_tred.h
68
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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue