102 lines · 4.1 KB · C
RawDownload
/* This file contains utilities shared between the different training scripts. In particular, we define a series of macros xxxCheck that call the corresponding C standard library function and check its return code. If an error was reported, the program prints some debug information and exits.*/#ifndef UTILS_H#define UTILS_H #include <stdio.h>#include <stdlib.h> // ----------------------------------------------------------------------------// fread convenience utils, with nice handling of error checking using macros// simple replace fopen, fread, fclose, fseek// with fopenCheck, freadCheck, fcloseCheck, fseekCheck FILE *fopen_check(const char *path, const char *mode, const char *file, int line) {    FILE *fp = fopen(path, mode);    if (fp == NULL) {        fprintf(stderr, "Error: Failed to open file '%s' at %s:%d\n", path, file, line);        fprintf(stderr, "Error details:\n");        fprintf(stderr, "  File: %s\n", file);        fprintf(stderr, "  Line: %d\n", line);        fprintf(stderr, "  Path: %s\n", path);        fprintf(stderr, "  Mode: %s\n", mode);        fprintf(stderr, "---> HINT 1: dataset files/code have moved to dev/data recently (May 20, 2024). You may have to mv them from the legacy data/ dir to dev/data/(dataset), or re-run the data preprocessing script. Refer back to the main README\n");        fprintf(stderr, "---> HINT 2: possibly try to re-run `python train_gpt2.py`\n");        exit(EXIT_FAILURE);    }    return fp;} #define fopenCheck(path, mode) fopen_check(path, mode, __FILE__, __LINE__) void fread_check(void *ptr, size_t size, size_t nmemb, FILE *stream, const char *file, int line) {    size_t result = fread(ptr, size, nmemb, stream);    if (result != nmemb) {        if (feof(stream)) {            fprintf(stderr, "Error: Unexpected end of file at %s:%d\n", file, line);        } else if (ferror(stream)) {            fprintf(stderr, "Error: File read error at %s:%d\n", file, line);        } else {            fprintf(stderr, "Error: Partial read at %s:%d. Expected %zu elements, read %zu\n",                    file, line, nmemb, result);        }        fprintf(stderr, "Error details:\n");        fprintf(stderr, "  File: %s\n", file);        fprintf(stderr, "  Line: %d\n", line);        fprintf(stderr, "  Expected elements: %zu\n", nmemb);        fprintf(stderr, "  Read elements: %zu\n", result);        exit(EXIT_FAILURE);    }} #define freadCheck(ptr, size, nmemb, stream) fread_check(ptr, size, nmemb, stream, __FILE__, __LINE__) void fclose_check(FILE *fp, const char *file, int line) {    if (fclose(fp) != 0) {        fprintf(stderr, "Error: Failed to close file at %s:%d\n", file, line);        fprintf(stderr, "Error details:\n");        fprintf(stderr, "  File: %s\n", file);        fprintf(stderr, "  Line: %d\n", line);        exit(EXIT_FAILURE);    }} #define fcloseCheck(fp) fclose_check(fp, __FILE__, __LINE__) void fseek_check(FILE *fp, long off, int whence, const char *file, int line) {    if (fseek(fp, off, whence) != 0) {        fprintf(stderr, "Error: Failed to seek in file at %s:%d\n", file, line);        fprintf(stderr, "Error details:\n");        fprintf(stderr, "  Offset: %ld\n", off);        fprintf(stderr, "  Whence: %d\n", whence);        fprintf(stderr, "  File:   %s\n", file);        fprintf(stderr, "  Line:   %d\n", line);        exit(EXIT_FAILURE);    }} #define fseekCheck(fp, off, whence) fseek_check(fp, off, whence, __FILE__, __LINE__) // ----------------------------------------------------------------------------// malloc error-handling wrapper util void *malloc_check(size_t size, const char *file, int line) {    void *ptr = malloc(size);    if (ptr == NULL) {        fprintf(stderr, "Error: Memory allocation failed at %s:%d\n", file, line);        fprintf(stderr, "Error details:\n");        fprintf(stderr, "  File: %s\n", file);        fprintf(stderr, "  Line: %d\n", line);        fprintf(stderr, "  Size: %zu bytes\n", size);        exit(EXIT_FAILURE);    }    return ptr;} #define mallocCheck(size) malloc_check(size, __FILE__, __LINE__) #endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t