What do I need to change/add to enable multiple processors (MP) support for the macOS?
I see that in Makefile.dist, I need to uncommented OpenMP support. But what else do I need?
How do I control the number of CPU cores for processing the RAW file in parallel?
Apple's clang (from XCode 12
Apple's clang (from XCode 12.4) refuses -fopenmp option, so OpenMP is not supported by this (standard macOS) compiler
If you use another compiler/runtime please refer your OpenMP runtime docs about "How do I control the number of CPU cores...."
-- Alex Tutubalin @LibRaw LLC
Xcode 12.4 actually works
Xcode 12.4 actually works with -fopenmp, you need to add -Xclang option just before it.
I made a small sample code like this:
int main(int argc, const char * argv[]) {
omp_set_num_threads(8);
#pragma omp parallel
#pragma omp critical
NSLog(@"Greetings from thread %d", omp_get_thread_num());
return NSApplicationMain(argc, argv);
}
And I get this on the console:
2021-10-20 16:23:46.653740-0700 Test[14661:304853] Greetings from thread 0
2021-10-20 16:23:46.653954-0700 Test[14661:304941] Greetings from thread 1
2021-10-20 16:23:46.653985-0700 Test[14661:304943] Greetings from thread 3
2021-10-20 16:23:46.654015-0700 Test[14661:304942] Greetings from thread 2
2021-10-20 16:23:46.654045-0700 Test[14661:304944] Greetings from thread 4
2021-10-20 16:23:46.654069-0700 Test[14661:304947] Greetings from thread 7
2021-10-20 16:23:46.654085-0700 Test[14661:304946] Greetings from thread 6
2021-10-20 16:23:46.654102-0700 Test[14661:304945] Greetings from thread 5
My problem now is with libraw:
In the Makefile.dist, I uncommented CFLAGS+=-fopenmp and I added -Xclang to it, so it looks like:
CFLAGS+=-Xclang -fopenmp
It compiles fine, but when I linked my project, it'll link even I did not have libomp.dylib. So libraw is not really compiled with OpenMP support with the CFLAGS line above.
So what else is missing?
Kuro
I'm unable to build openmp
I'm unable to build openmp app with Xcode/clang because of omp.h missing. find / -name omp.h returns nothing.
So:
1) It is not possible to compile LibRaw with openmp using standard Apple tools (12.4 and 12.5)
2) If you was able to compile it: that means you have omp.h from some other build tools, we're unable to provide support in that case. You may add some #error preprocessor directives into LibRaw sources near #pragma omp to make sure it compiled with openmp or not.
-- Alex Tutubalin @LibRaw LLC
Just follow the instructions
Just follow the instructions on this link:
https://mac.r-project.org/openmp/
I grabbed the OpenMP dylib there and it compiles fine. No need to download another version of llvm.
In fact, I finally got LibRaw to work. There is a bug in Libraw_types.h in which it failed to detect -fopenmp when compiling via Xcode. Fixing that LibRaw compiles just fine using Xcode 12.4 with OpenMP support.
The question I have now is: how to control the number of threads during decode? It seems the #pragma parallel will cause the number of threads creation the same as the number of logical processor. I don't want that many. Is there a way I can alter that during runtime before calling unpack()?
Kuro
If you're speaking about:
If you're speaking about:
#elif (defined(__APPLE__) || defined(__MACOSX__)) && defined(_REENTRANT)
/* Latest XCode works with OpenMP, need to recheck here */
#undef LIBRAW_USE_OPENMP
This is not bug, but specially added because standard Apple toolchain does not support OpenMP
For other toolchains one may use -DLIBRAW_FORCE_OPENMP to enable this #if-branch:
#if defined(LIBRAW_FORCE_OPENMP)
...
-- Alex Tutubalin @LibRaw LLC
Probably we need to remove
Probably we need to remove comment 'need to recheck': rechecked and, yes, it will not work in standard Apple-provided environment
-- Alex Tutubalin @LibRaw LLC
This is no longer true.
This is no longer true. Standard Apple Toolchain works with OpenMP. Just add -Xclang -fopenmp to the compile flags.
I have to add -DLIBRAW_FORCE_OPENMP in the Makefile.dist in order for it work for standard Apple Toolchain.
That aside, but how do I control the number of threads to use? It seems be always the same as the number of logical processors.
Kuro
There is no omp.h file in
There is no omp.h file in standard toolchain
-- Alex Tutubalin @LibRaw LLC