diff --git a/Makefile b/Makefile index 8fb474b..c0f4c37 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,4 @@ +OS := $(shell uname) BUILDDIR := ./build SRCDIR := ./src CACHE_DIR := ./.cache @@ -41,6 +42,13 @@ NVCCFLAGS = -g # -fsanitize=address -lasan #! WARNING: test/cnn-neuron_io fails with this option enabled +# Specify library path of libjpeg on MacOS +ifeq ($(OS),Darwin) + LD_CFLAGS += -I/opt/homebrew/Cellar/jpeg/9e/include/ -L/opt/homebrew/Cellar/jpeg/9e/lib/ + LD_NVCCFLAGS += -L/opt/homebrew/Cellar/jpeg/9e/lib/ + + CFLAGS += -I/opt/homebrew/Cellar/jpeg/9e/include/ +endif all: dense cnn; diff --git a/README.md b/README.md index f8aa7aa..8e268e6 100644 --- a/README.md +++ b/README.md @@ -178,17 +178,24 @@ Résultats avec VGG16, pour des images de 256x256 pixels (seulement une plus pet Sur le cloud avec google Colab: bon GPU mais mauvais processeur: [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1LfwSrQRaoC91yC9mx9BKHzuc7odev5r6?usp=sharing) -Les distributions suivantes ont étés essayées, il sera sans doute nécessaire de modifier le code pour l'exécuter sous Windows/ MacOS: +## Dépendances +- `cuda` : pour utiliser la carte graphique (NVIDIA seulement) +- `libjpeg-dev` : n'est pas nécessairement installé par défaut +- GNU `make` : installé par défaut sur la majorité des distributions Linux et sur MacOS +- `gcc` : installé par défaut sur la majorité des distributions Linux et sur MacOS + +### Linux +Les distributions suivantes ont étés essayées, il faudra parfois installer `libjpeg` - Arch - Fedora - Manjaro -- Ubuntu +- Ubuntu: `apt install libjpeg-dev` -## Dépendances -- `cuda` : pour utiliser la carte graphique (NVIDIA seulement) -- `libjpeg-dev` : n'est pas installé par défaut sur ubuntu notamment -- GNU `make` : installé par défaut sur la majorité des distributions -- `gcc` : installé par défaut sur la majorité des distributions +### MacOS +Avec [Homebrew](https://brew.sh/): +```bash +brew install libjpeg +``` ## Compilation diff --git a/src/cnn/train.c b/src/cnn/train.c index 36921c0..119ca81 100644 --- a/src/cnn/train.c +++ b/src/cnn/train.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -7,6 +6,14 @@ #include #include +#ifdef __linux__ + #include +#elif defined(__APPLE__) + #include +#else + #error Unknown platform +#endif + #include "../common/include/memory_management.h" #include "../common/include/colors.h" #include "../common/include/utils.h" @@ -261,7 +268,17 @@ void train(int dataset_type, char* images_file, char* labels_file, char* data_di #ifdef USE_MULTITHREADING int nb_remaining_images; // Nombre d'images restantes à lancer pour une série de threads // Récupération du nombre de threads disponibles - int nb_threads = get_nprocs(); + #ifdef __linux__ + int nb_threads = get_nprocs(); + #elif defined(__APPLE__) + int nb_threads; + size_t len = sizeof(nb_threads); + + if (sysctlbyname("hw.logicalcpu", &nb_threads, &len, NULL, 0) == -1) { + perror("sysctl"); + exit(1); + } + #endif pthread_t *tid = (pthread_t*)malloc(nb_threads * sizeof(pthread_t)); // Création des paramètres donnés à chaque thread dans le cas du multi-threading diff --git a/src/dense/main.c b/src/dense/main.c index 5135d78..5c67cd6 100644 --- a/src/dense/main.c +++ b/src/dense/main.c @@ -4,7 +4,14 @@ #include #include #include -#include + +#ifdef __linux__ + #include +#elif defined(__APPLE__) + #include +#else + #error Unknown platform +#endif #include "include/neural_network.h" #include "../common/include/colors.h" @@ -201,7 +208,17 @@ void train(int epochs, char* recovery, char* image_file, char* label_file, char* float accuracy; float current_accuracy; - int nb_threads = get_nprocs(); + #ifdef __linux__ + int nb_threads = get_nprocs(); + #elif defined(__APPLE__) + int nb_threads; + size_t len = sizeof(nb_threads); + + if (sysctlbyname("hw.logicalcpu", &nb_threads, &len, NULL, 0) == -1) { + perror("sysctl"); + exit(1); + } + #endif pthread_t *tid = (pthread_t *)malloc(nb_threads * sizeof(pthread_t)); /* diff --git a/test/cnn_jpeg.c b/test/cnn_jpeg.c index 40965ad..bcc8869 100644 --- a/test/cnn_jpeg.c +++ b/test/cnn_jpeg.c @@ -33,7 +33,9 @@ int main(int argc, char* argv[]) { } printf("OK\n"); end_time = clock(); - printf("Temps par image (calculé sur une moyenne de %d): %lf s\n", N, (end_time - start_time)/N); + printf("Temps par image (calculé sur une moyenne de %d): ", N); + printf_time((end_time - start_time)/N); + printf("\n"); for (int i=0; i < (int)dataset->numImages; i++) { if (!dataset->fileNames[i]) {