[CMake] PLEASE HELP: about openmp and cmake !!!!

Kaveh Kohan kaveh.kohan at yahoo.com
Thu Jan 22 20:33:32 EST 2009


Hi everybody,

I have a problem with CMAKE and I would be very appreciated if anybody can help.

Basically, I am trying to compile very simple piece of multi-threaded code with CMAKE. I downloaded the code from:

https://computing.llnl.gov/tutorials/openMP/exercise.html

and specifically this:
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");

}

Here is the CMakefile I use:

PROJECT(omp_mm)

SET(CurrentExe "omp_mm")
ADD_EXECUTABLE(${CurrentExe} omp_mm.c ) 

and I change:
CMAKE_EXE_LINKER_FLAGS : -fopenmp

"Seemingly", it compiles  correctly:
make
Linking C executable omp_mm
[100%] Built target omp_mm

but it seems that it ignores #pragma and no matter how I set $OMP_NUM_THREADS, it always lunch one thread.

""Surprisingly"", when  I compiled it on the command line by:
>> g++  omp_mm.c  -o omp_mm -fopenmp

it compiles and "works" perfectly and lunch as many threads as I set it $OMP_NUM_THREADS.

I am quite frustrated, Makefile generated by cmake is not easy to edit.  Here is my Cmake and gcc information, in case it is required:

cmake version 2.6-patch 2
 >> gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.3.2-1ubuntu11' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu11) 



I would be thankful if you could help.


Regards,
Kaveh


      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20090122/c70df71f/attachment.htm>


More information about the CMake mailing list