openmp probleme compilation simple parallelisation
Bonjour,
j'essaye de me mettre a openmp pour accelerer mon programme et j'ai l'impression que j'ai mal configure quelque chose sur code::blocks.
j'essaye pour le moment une parrallelisation "toute bete".
j' ai cette grosse boucle dans mon programme:
Code:
1 2 3 4 5 6 7
| for(count=0;count<dim;count++)
{
if(denom[count]>0)
{
f3d[count]=f3d[count]+wth*ftemp[count]/denom[count];
}
} // end for count |
et j'ai voulu faire:
Code:
1 2 3 4 5 6 7 8 9 10
| #pragma omp parallel for num_threads(6)
for(count=0;count<dim;count++)
{
if(denom[count]>0)
{
int rang = OMP_GET_THREAD_NUM();
cout << "rang: " << rang;
f3d[count]=f3d[count]+wth*ftemp[count]/denom[count];
}
} // end for count |
pour faire un test tout bete.
a la compilation ca me dit:
Code:
1 2 3
| g++ -Wall -fexceptions -g -march=corei7-avx -O3 -fopenmp -Iinclude -c /path/test_class.cpp -o obj/Debug/src/test_class.o
/path/test_class.cpp: In member function void Images::SART_reconstruction(int, std::string):
/path/test_class.cpp:1037:39: error: OMP_GET_THREAD_NUM was not declared in this scope |
je trouve ca bizarre deja vu que omp_get_thread_num existe sur les cours openmp que j'ai lu.
et si j'enleve le omp_get_thread_num (et cout << rang du coup) j'ai cette erreure a la compilation:
Code:
1 2 3 4 5 6 7 8 9 10
| g++ -Wall -fexceptions -g -march=corei7-avx -O3 -fopenmp -Iinclude -c /path/test_class.cpp -o obj/Debug/src/test_class.o
/path/test_class.cpp: In member function void Images::SART_reconstruction(int, std::string):
/path/test_class.cpp:574:5: warning: variable m set but not used [-Wunused-but-set-variable]
g++ -o bin/Debug/SART obj/Debug/main.o obj/Debug/src/test_class.o
obj/Debug/src/test_class.o: In function `Images::SART_reconstruction(int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >) [clone ._omp_fn.0]':
/path/test_class.cpp:1032: undefined reference to `omp_get_num_threads'
/path/test_class.cpp:1032: undefined reference to `omp_get_thread_num'
obj/Debug/src/test_class.o: In function `Images::SART_reconstruction(int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
/path/test_class.cpp:1031: undefined reference to `GOMP_parallel_start'
/path/test_class.cpp:1031: undefined reference to `GOMP_parallel_end' |
ca me donne l'impression que openmp est mal configure sur mon pc.
pourtant a priori il est pas defaut sur le compilateur avec ubuntu 12.04.
et dans code::blocks, dans settings->compiler -> other options, j'ai ajoute -fopenmp comme j'avais vu sur le net.
est-ce que quelques a une idee ?
code bloc C- OPenMP et quid
Bonjour ,
je suis sous windobe 8.
COdeblock est installer avec la version embarque de Minwg
et de plus celui-ci est installer dans un répertoire de window.
j'ai pris le code propose sur openmp.org
Code:
1 2 3 4 5 6 7
| #include <omp.h>
#include <stdio.h>
int main()
{
#pragma omp parallel
printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
} |
dans setting j'ai mis pour le compilateur (other option) --> -fopenmp
dans link setting Link libraries je pointe sue le lien de c:\MinGW\bin (qui contient la dll libopenmp-1.dll).
voici ce qu j'obtiens -->
||=== Build: Debug in gExo001 (compiler: GNU GCC Compiler) ===|
ld.exe||cannot find c:\MinGW\bin: Permission denied|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
jsi j'enleve le lien sur la bib
||=== Build: Debug in gExo001 (compiler: GNU GCC Compiler) ===|
obj\Debug\main.o||In function `main':|
C:\dee\ProjetProgrammeur\gExo001\main.c|4|undefined reference to `GOMP_parallel_start'|
C:\dee\ProjetProgrammeur\ProjetProgrammeur\gExo001\main.c|5|undefined reference to `GOMP_parallel_end'|
C:\dee\ProjetProgrammeur\ProjetProgrammeur\gExo001\main.c|6|undefined reference to `omp_get_num_threads'|
C:\dee\ProjetProgrammeur\ProjetProgrammeur\gExo001\main.c|6|undefined reference to `omp_get_thread_num'|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
ld.exe||cannot find c:\MinGW\bin: Permission denied|
J'ai trouve ce qu'ili faut faire
Phase N°1 :mingw-w64
http://sourceforge.net/projects/ming...e=typ_redirect
Phase N°2 :
http://www.codeblocks.org/downloads/26
http://sourceforge.net/projects/code...p.exe/download
Phase N°3 :
installation de mingw
Avec MinGW Installer : j'ajoute la bibliothèque dans le "path " de windows
Installation de codeblocks-13.12-setup.exe
Modification du paramétrage du menu setting / Compiler / compiler setting
other option : -fopenmp
link librairies : C:\MinGW\bin\libgomp-1.dll
tookchain executables mettre : C:\MinGW
auto-detect
O glups mingw-w64 s 'installe sur une autre machine dans C:\Program Files (x86)\mingw-w64\i686-4.9.2-posix-dwarf-rt_v3-rev1\mingw32\bin
et donc tous est en rapport
l'exemple de code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include <stdio.h>
#include <omp.h> // include OpenMP
#define NUM_DATA_TOT 1024
int main(int argc, char *argv[]) {
double data[NUM_DATA_TOT];
int i ;
int numero_du_threads=0;
int nombre_de_threads=0;
/* initialisation de l'array data */
for (i = 0; i < NUM_DATA_TOT; ++i)
data[i] = 3.14*i;
double somme = 0;
/* procedure d'addition multi-thread */
/* boucle for parallèle */
#pragma omp parallel for reduction(+:somme)
for (i = 0; i < NUM_DATA_TOT; ++i){
somme += data[i];
nombre_de_threads = omp_get_num_threads();
numero_du_threads = omp_get_thread_num() ;
printf(" Le thread N° %d traite la calcul sur un ensemble de %d thread\n" , numero_du_threads , nombre_de_threads );
/*
omp_get_num_threads() : renvoie le nombre de threads qui exécutent une section parallèle
omp_get_thread_num() : renvoie un entier qui correspond au numéro du thread (en partant de 0)
*/
printf("somme des tous les elements = %f\n", somme);
}
return 0;
} |
compilation et voila ca marche