2017-06-29 1 views
-1

Ich versuche OpenMP in einigen C-Code zu implementieren, den ich von R anrufe. Im Moment benutze ich ein Testprogramm, um zu sehen, wie viele Threads ich habe, aber ich kann nicht mehr als einen Thread bekommen. Wie kann ich mehr als einen Thread erhalten, wenn dieses Programm ausgeführt wird?Wie kompiliere ich C-Code mit R CMD SHLIB, um OpenMP zu verwenden?

Hier sind die Inhalte von test_omp.c:

#ifdef _OPENMP 
    #include <omp.h> 
#endif 
#include <stdio.h> 
#include <R.h> 

void test_omp(){ 
    int num_threads=-1; 
    #ifdef _OPENMP 
    printf("We have Open MP!\n"); 
    omp_set_num_threads(2); 
    num_threads = omp_get_num_threads(); 
    #else 
    printf(":(\n"); 
    #endif 
    printf("Number of OpenMP threads: %d\n",num_threads); 
} 

ich dann kompilieren dies das Shell-Skript:

#!/bin/bash 
export OMP_NUM_THREADS=2 
export PKG_CFLAGS="-fopenmp" 
export PKG_LIBS="-lgomp" 
R CMD SHLIB test_omp.c 

ich den folgenden Code in R dann laufen

dyn.load("test_omp.so") 
.C("test_omp") 

und ich bekomme folgende Ausgabe:

We have Open MP! 
Number of OpenMP threads: 1 

Ich erwarte 2 Fäden, aber ich bekomme nur einen. Wie kann ich mehr als einen Thread bekommen?

+0

was meinst du 'wie viele Threads ich habe '? Zu der Zeit, dieses Programm läuft - es hat 1 Thread, wenn Sie mehr erstellen - Sie haben mehr –

+0

@llya Bursov - Ich weiß, ich habe einen Thread zur Laufzeit - das ist das Problem. Um openMP effektiv zu betreiben, muss ich mehr als eins haben. Wie würde ich mehr schaffen? – Rich

+0

Wie haben Sie überhaupt versucht, ein Handbuch zu lesen? versuchen Sie dieses Beispiel https://msdn.microsoft.com/en-us/library/xdeb73hc.aspx zuerst –

Antwort

0

Dank @llya Bursovs Kommentare habe ich die Lösung gefunden. Der Grund, warum nur ein Thread gefunden wurde, war, weil ich omp_get_num_threads() außerhalb eines #pragma omp parallel Blocks anrief. Wenn ich den Code ändern und omp_get_num_threads() innerhalb eines #pragma omp parallel Block platzieren, erhalte ich die zwei Threads, die ich erwartet hatte:

#ifdef _OPENMP 
    #include <omp.h> 
#endif 
#include <stdio.h> 
#include <R.h> 

void test_omp(){ 
    int num_threads=-1; 
    #ifdef _OPENMP 
    printf("We have Open MP!\n"); 
    omp_set_num_threads(2); 
    #pragma omp parallel 
     #pragma omp master 
     { 
      // num_threads = omp_get_num_threads(); 
      printf("Number of OpenMP threads: %d\n",omp_get_num_threads()); 
     } 
    #else 
    printf(":(\n"); 
    #endif 
    printf("Number of OpenMP threads: %d\n",num_threads); 
} 

ich die folgende Ausgabe von R (nach oben Kompilieren):

We have Open MP! 
Number of OpenMP threads: 2 
Number of OpenMP threads: -1