[Insight-users] about multithreading in ITK (Andriy Fedorov)
Bill Lorensen
bill.lorensen at gmail.com
Sat Jan 31 00:11:54 EST 2009
I think -fopenmp is a compiler flag, not a linker flag.
Try changing CMAKE_C_FLAGS instead of CMAKE_EXE_LINKER_FLAGS
Bill
2009/1/22 Kaveh Kohan <kaveh.kohan at yahoo.com>:
> Thank you Andriy for your reply.
>
> Actually my problem is way simpler than that. I want to multiply matrices
> (ordinary matrix-matrix multiplication and element-wise multiplication) but
> my algorithm involves iterative and large matrix multiplication. I tried to
> exploit multi-threading by openmp (not openmpi). I googled it and find this
> simple code for multi-threaded matrix-matrix multiplication:
>
> from: https://computing.llnl.gov/tutorials/openMP/samples/C/omp_mm.c
> /******************************************************************************
> * FILE: omp_mm.c
> * DESCRIPTION:
> * OpenMp Example - Matrix Multiply - C Version
> * Demonstrates a matrix multiply using OpenMP. Threads share row
> iterations
> * according to a predefined chunk size.
> * AUTHOR: Blaise Barney
> * LAST REVISED: 06/28/05
> ******************************************************************************/
> #include <omp.h>
> #include <stdio.h>
> #include <stdlib.h>
>
> #define NRA 62 /* number of rows in matrix A */
> #define NCA 15 /* number of columns in matrix A */
> #define NCB 7 /* number of columns in matrix B */
>
> int main (int argc, char *argv[])
> {
> int tid, nthreads, i, j, k, chunk;
> double a[NRA][NCA], /* matrix A to be multiplied */
> b[NCA][NCB], /* matrix B to be multiplied */
> c[NRA][NCB]; /* result matrix C */
>
> chunk = 10; /* set loop iteration chunk size */
>
> /*** Spawn a parallel region explicitly scoping all variables ***/
> #pragma omp parallel shared(a,b,c,nthreads,chunk) private(tid,i,j,k)
> {
> tid = omp_get_thread_num();
> if (tid == 0)
> {
> nthreads = omp_get_num_threads();
> printf("Starting matrix multiple example with %d threads\n",nthreads);
> printf("Initializing matrices...\n");
> }
> /*** Initialize matrices ***/
> #pragma omp for schedule (static, chunk)
> for (i=0; i<NRA; i++)
> for (j=0; j<NCA; j++)
> a[i][j]= i+j;
> #pragma omp for schedule (static, chunk)
> for (i=0; i<NCA; i++)
> for (j=0; j<NCB; j++)
> b[i][j]= i*j;
> #pragma omp for schedule (static, chunk)
> for (i=0; i<NRA; i++)
> for (j=0; j<NCB; j++)
> c[i][j]= 0;
>
> /*** Do matrix multiply sharing iterations on outer loop ***/
> /*** Display who does which iterations for demonstration purposes ***/
> printf("Thread %d starting matrix multiply...\n",tid);
> #pragma omp for schedule (static, chunk)
> for (i=0; i<NRA; i++)
> {
> printf("Thread=%d did row=%d\n",tid,i);
> for(j=0; j<NCB; j++)
> for (k=0; k<NCA; k++)
> c[i][j] += a[i][k] * b[k][j];
> }
> } /*** End of parallel region ***/
>
> /*** Print results ***/
> printf("******************************************************\n");
> printf("Result Matrix:\n");
> for (i=0; i<NRA; i++)
> {
> for (j=0; j<NCB; j++)
> printf("%6.2f ", c[i][j]);
> printf("\n");
> }
> printf("******************************************************\n");
> printf ("Done.\n");
>
> }
>
>
> it compiles and works perfectly when I type:
>>> g++ omp_mm.c -o omp_mm -fopenmp
>
> but when I add following lines to my CMakefile:
> SET(CurrentExe "omp_mm")
> ADD_EXECUTABLE(${CurrentExe} omp_mm.c ${SRCS} ${HDRS})
> TARGET_LINK_LIBRARIES(${CurrentExe} ${Libraries})
>
> and change :
> CMAKE_EXE_LINKER_FLAGS : -fopenmp
>
> here is what I get in compilation time:
> /home/kaveh/Src/ITKNMF/Source/omp_mm.c: In function 'main':
> /home/kaveh/Src/ITKNMF/Source/omp_mm..c:28: warning: ignoring #pragma omp
> parallel
> /home/kaveh/Src/ITKNMF/Source/omp_mm.c:38: warning: ignoring #pragma omp for
> /home/kaveh/Src/ITKNMF/Source/omp_mm.c:42: warning: ignoring #pragma omp for
> /home/kaveh/Src/ITKNMF/Source/omp_mm.c:46: warning: ignoring #pragma omp for
> /home/kaveh/Src/ITKNMF/Source/omp_mm.c:54: warning: ignoring #pragma omp for
> /home/kaveh/Src/ITKNMF/Source/omp_mm.c:76: warning: control reaches end of
> non-void function
>
> and no matter how I change the enviroment variable of $OMP_NUM_THREADS, it
> always lunches one thread. Unlike when I compile it with command line
> (without cmake), in which it works perfectly!!!!
>
> Now, I am confused!! There should be something wrong with cmake but how can
> I fix it?
>
> Second question is, ITK uses LAPACK and LAPACK is multithreaded (corret me
> if I am wrong). If yes how can I set number of threads for matrix
> multiplication?
>
> Regards,
> Kaveh
>
> Kaveh,
>
> You can look at PETSc for parallel linear algebra routines:
> http://www.mcs.anl.gov/petsc/petsc-as/.
>
> In the past I used PETSc in conjunction with ITK code. You have to be
> careful to make sure that both PETSc and ITK are compiled with the
> same mpicc/mpicxx/mpiCC compiler.
>
> Hope this helps
>
> Andriy Fedorov
>
>
>
>> Date: Wed, 21 Jan 2009 09:01:08 -0800 (PST)
>> From: Kaveh Kohan <kaveh.kohan at yahoo.com>
>> Subject: [Insight-users] about multithreading in ITK
>> To: insight-users at itk.org
>> Message-ID: <352748.10256.qm at web59915.mail.ac4.yahoo.com>
>> Content-Type: text/plain; charset="us-ascii"
>>
>> Hello All,
>>
>> I have a general question about multi-threading in ITK and I would be
>> thankful if anybody
>> answer:
>>
>> As far as I know, ITK uses vnl for linear albera operation but it is not
>> multithreaded (Please correct me if I am wrong). While many complicated
>> algorithm are already multithreaded in ITK, was there any technical reason
>> that
>> linear algebra operation (like matrix-matrix multiplication, solving
>> linear
>> system, LU, ....) is not multithreaded? Perhaps it didn't have priority.
>>
>> I would be appreciated if you tell what is the best way to implement
>> efficient,
>> multithread linear algebra operation. In case it is not a good idea to use
>> ITK
>> API for multithreading of such operation, is there any third party
>> multithreaded
>> libray for linear algebra operation that I can link to ITK.
>>
>>
>> Regards,
>> Kaveh
>>
>>
>>
>>
>
>
>
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
>
>
More information about the Insight-users
mailing list