Hi everybody! Could somebody help me with the following?
I'm trying to run a simple Hello World code in openmp using .C function. The
C code i have is:
#include <omp.h>
#include <stdio.h>
#include <R.h>
void hello_omp(int *n) {
int th_id, nthreads;
omp_set_num_threads(*n);
#pragma omp parallel private(th_id)
{
th_id = omp_get_thread_num();
Rprintf("Hello World from thread %d\n", th_id);
#pragma omp barrier
if ( th_id == 0 ) {
nthreads = omp_get_num_threads();
Rprintf("There are %d threads\n",nthreads);
}
}
}
Where n is the number of threads that i want.
I compite it with "R CMD SHLIB hello_openmp_R.c -fopenmp" and when I
try to
run it in R using:
dyn.load("hello_openmp_R.so")
hello_omp=function(n){.C("hello_omp",as.integer(n))}
hello_omp(3)
hello_omp(2)
Only 1 thread is been used, instead of 3 and 2:
> hello_omp(3)
Hello World from thread 0
There are 1 threads
[[1]]
[1] 3
> hello_omp(2)
Hello World from thread 0
There are 1 threads
[[1]]
[1] 2
I also tried to set OMP_NUM_THREADS=3 in the Konsole with "export
OMP_NUM_THREADS=3", in the .c file directory, but it seems that R don't
recognize it when calls .C
I am using R version 2.10.1 in Ubuntu 9.10 - Karmic Koala, but i'm newbie in
Linux.
Thanks a lot in advance for your help !*
*
[[alternative HTML version deleted]]
Dirk Eddelbuettel
2010-Jul-10 18:01 UTC
[Rd] Set the number of threads using openmp with .C
Eduardo,
On 10 July 2010 at 19:31, Eduardo Garc?a wrote:
| Hi everybody! Could somebody help me with the following?
|
| I'm trying to run a simple Hello World code in openmp using .C function.
The
| C code i have is:
|
| #include <omp.h>
| #include <stdio.h>
| #include <R.h>
|
| void hello_omp(int *n) {
| int th_id, nthreads;
| omp_set_num_threads(*n);
| #pragma omp parallel private(th_id)
| {
| th_id = omp_get_thread_num();
| Rprintf("Hello World from thread %d\n", th_id);
| #pragma omp barrier
| if ( th_id == 0 ) {
| nthreads = omp_get_num_threads();
| Rprintf("There are %d threads\n",nthreads);
| }
| }
| }
|
| Where n is the number of threads that i want.
|
| I compite it with "R CMD SHLIB hello_openmp_R.c -fopenmp" and when I
try to
| run it in R using:
|
| dyn.load("hello_openmp_R.so")
| hello_omp=function(n){.C("hello_omp",as.integer(n))}
| hello_omp(3)
| hello_omp(2)
|
| Only 1 thread is been used, instead of 3 and 2:
|
| > hello_omp(3)
| Hello World from thread 0
| There are 1 threads
| [[1]]
| [1] 3
|
|
| > hello_omp(2)
| Hello World from thread 0
| There are 1 threads
| [[1]]
| [1] 2
|
| I also tried to set OMP_NUM_THREADS=3 in the Konsole with "export
| OMP_NUM_THREADS=3", in the .c file directory, but it seems that R
don't
| recognize it when calls .C
|
| I am using R version 2.10.1 in Ubuntu 9.10 - Karmic Koala, but i'm newbie
in
| Linux.
|
| Thanks a lot in advance for your help !*
You were almost there, but your compile instructions were wrong. You must
pass -fopenmp to gcc. Which you tried, alas wrongly, and then overlooked the
warnings (and I called your file eduardo.c here) :
gcc -std=gnu99 -I/usr/share/R/include -fpic -O3 -Wall -pipe -c
eduardo.c -o eduardo.o
eduardo.c: In function ?hello_omp?:
eduardo.c:7: warning: ignoring #pragma omp parallel
eduardo.c:11: warning: ignoring #pragma omp barrier
One way of passing argument to gcc via 'R CMF foo' is to to use the
PKG_CPPFLAGS and PKG_LIBS arguments. The following shell script builds and
runs the code:
#!/bin/sh
PKG_CPPFLAGS="-fopenmp" \
PKG_LIBS="-lgomp" \
R CMD SHLIB eduardo.c
cat <<EOF | R --silent --no-save
dyn.load("eduardo.so")
hello_omp=function(n){.C("hello_omp",as.integer(n))}
hello_omp(3)
hello_omp(2)
EOF
and this generates the following output:
edd at max:/tmp$ ./eduardo.sh
gcc -std=gnu99 -I/usr/share/R/include -fopenmp -fpic -O3 -Wall -pipe -c
eduardo.c -o eduardo.o
gcc -std=gnu99 -shared -o eduardo.so eduardo.o -lgomp -L/usr/lib64/R/lib -lR
> dyn.load("eduardo.so")
> hello_omp=function(n){.C("hello_omp",as.integer(n))}
> hello_omp(3)
Hello World from thread 0
Hello World from thread 2
Hello World from thread 1
There are 3 threads
[[1]]
[1] 3
> hello_omp(2)
Hello World from thread 0
Hello World from thread 1
There are 2 threads
[[1]]
[1] 2
>
edd at max:/tmp$
Have a look at the CRAN package 'inline' which allows you to compile,
load,
link such short code snippets much more easily.
Lastly, one word of caution. R is famously single-threaded. You may get
yourself into trouble with OpenMP unless you set locks rather carefully.
There is of course the famous example of Luke Tierney's pnmath (at
http://www.stat.uiowa.edu/~luke/R/experimental/) so there is also some scope
for using this.
Hope this helps.
--
Regards, Dirk