Accéder au contenu.
Menu Sympa

starpu-devel - Re: [Starpu-devel] Dépendances dynamiques

Objet : Developers list for StarPU

Archives de la liste

Re: [Starpu-devel] Dépendances dynamiques


Chronologique Discussions 
  • From: Adrien Roussel Fraunhofer ITWM <adrien.roussel@itwm.fraunhofer.de>
  • To: Samuel Thibault <samuel.thibault@inria.fr>, starpu-devel@lists.gforge.inria.fr
  • Subject: Re: [Starpu-devel] Dépendances dynamiques
  • Date: Mon, 02 Jul 2018 23:21:57 +0200
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=adrien.roussel@itwm.fraunhofer.de; spf=Pass smtp.mailfrom=adrien.roussel@itwm.fraunhofer.de; spf=None smtp.helo=postmaster@mail-edgeDD24.fraunhofer.de
  • Ironport-phdr: 9a23:BLu95B/Cbj7X8f9uRHKM819IXTAuvvDOBiVQ1KB+0+kWIJqq85mqBkHD//Il1AaPAd2Fraocw8Pt8InYEVQa5piAtH1QOLdtbDQizfssogo7HcSeAlf6JvO5JwYzHcBFSUM3tyrjaRsdF8nxfUDdrWOv5jAOBBr/KRB1JuPoEYLOksi7ze+/94HSbglSmDaxfa55IQmrownWqsQYm5ZpJLwryhvOrHtIeuBWyn1tKFmOgRvy5dq+8YB6/ShItP0v68BPUaPhf6QlVrNYFygpM3o05MLwqxbOSxaE62YGXWUXlhpIBBXF7A3/U5zsvCb2qvZx1S+HNsDtU7s6RSqt4LtqSB/wiScIKTg58H3MisdtiK5XuQ+tqwBjz4LRZoyeKfhwcb7Hfd4CS2VPXtxfWStDDYOycYUBEukPM+hEoIbyqFUDth6+CAq2Ce710DJFnH370Ksn2OohCwHG2wkgEsoSvXvJttX1NbkdUeaox6fUyjXDcuhW2Szj54jMbxsvoeuMUqhtccrXyUkvEA3FgUuKqYf4PD2byOQCvW+G5OdnT+2glnQnqwBvrTip3MsskI7Jhp8OylDf6yp5xJ04JdykSE91ZN6oCpVQtzuAOItrRMMiQ2ZouCgkxb0co5K0YTYFxY0hyhXCZfKHdI2I7QjiVOaXOTp4imhld6iihxa08UigzeP8Wdeu0FpQsyVKjN/BvW0O2RzL8sWLV/9w8lm71TqSywzf9PtILV01mKfZMZIt3LE9moIOvUnNAyP6glv6gaCXe0k+5+Sl7/nrbq/kq5KfMYJ/lxvwPb40msOlBOQ1KggOUHaf+eS7zLDj+Ff2QLROjvEvjKbWrZ/aKtoVqKC3HQNY3Zwv6xilDzi8zdQYm3kHLFVLeB2ZlYjlIUzBL+7gAfe+hVSjjitryujbMrDlHJnBNGXPnKv/cbpn9kJRyQg+wcpB659bEr0BJej8Wk71tNzWFB85NAm0zv79B9pgzIMeWHyAAqmDPKPItl+I+/kvI/KSa48Rozv9KuQl5vDrjXMjl18dZ7Om3YYRaHC4GfRmLVuWYWD2jtgcD2gGphA+Q/DyiF2eTT5TYG6/X7kg5j4hEoKmFZrDSpmwj7Ofwie0AJlWa3tCClCNCnfoa56EV+0DaCKcJc9hiDMEWqa7R48g0xGurg76xKB9Iura4C1L/a7kgeN84vDekVkO9T1+BtmZzynZVGhxg24MASM23ap2vEhh4laFy6lxxfJCQ5gb/O9ASB8ncJLR0eF+I9TzQR7aONiHT0ypT5OnByswR5Q/2YwgeUF4TvyulBHO2WKQBKIOjLGPTLIu+7/a33//Ktw16kr58eF1hlU8Q8ZJc3ehm7Vk+gz7BpLWlgOXja+3c6Qb0iPXsmuOmznd9HpEWRJ9BP2WFUsUYVHb+JGgvhubHu2eTI8/Ow4E8vasb65Da9nnl1JDHq+xOcjBZiS/gW6tAxaPyL6WKobnKTxEgHftTXMcmgVWxk6ocBAkD3358WPCEzkoG0jmfkXs9udzsjW3Qx1sllzYXwhaz7OwvyUtq7mcRvcUhONWvS4gr3B5EFmw8/6MV5yOvQN8eqVbb94npltKhzrU
  • List-archive: <http://lists.gforge.inria.fr/pipermail/starpu-devel/>
  • List-id: "Developers list. For discussion of new features, code changes, etc." <starpu-devel.lists.gforge.inria.fr>

Bonsoir,
J'ai réussi à reproduire le problème sur un ensemble d'opérations plus simple. Voici le main en question en PJ.
J'ai l'impression que c'est l'enchainement entre un produit scalaire (StarPUKernel::dot) qui produit la variable "res", puis la vérification de la nullité de la valeur de ce résultat via la méthode StarPUKernel::asserNull, qui produit cette erreur.
Je prends pourtant les bons handlers, et les modes d'accès sont bien spécifiés. Donc je n'arrive toujours pas à comprendre l'erreur renvoyée par StarPU. J'ai du zappé quelque chose sans doute, non ?

----------------ursprüngliche Nachricht-----------------
Von: Adrien Roussel [adrien.roussel@itwm.fraunhofer.de ]
An: Samuel Thibault [samuel.thibault@inria.fr ], starpu-devel@lists.gforge.inria.fr Datum: Mon, 2 Jul 2018 18:22:50 +0200
-------------------------------------------------


Bonjour,

Nouvelle correction, et j'ai encore un petit soucis.

Donc, ce coup-ci dans mon code je réutilise les starpu_data_handler_t pour générer mes tâches et ainsi pouvoir bien créer les dépédances entre les tâches.
Pour ce faire, je stocke dans une map associative (std::map) un pointeur correspondant à une donnée sur laquelle je vais faire des calculs, auquel j'associe un starpu_data_handler_t.
Cette map se trouve dans LinearAlgebraAPI/StarPU/StarPUKernel.h, nommée starpu_handlers.

Ensuite, si une nouvelle donnée arrive j'enregistre la donnée dans StarPU avec son handler; si je détecte que le pointeur existe déjà dans ma map, j'utilise le handler déjà créé.

Si j'exécute une petite séquence d'opération d'algébre linéaire (exemple: main_sequence.cpp), le résultat est correct et ça marche bien.
Si maintenant j'exécute une opération plus compliquée comme un solveur linéaire itératif (test_bicgs.cpp); où je me sers des infos que j'ai stocké et que je rejoue plusieurs fois les mêmes séquences, j'obtiens une erreur de la forme:


/apps/StarPU/1.2.4/lib/libstarpu-1.2.so.4(_starpu_task_declare_deps_
array+0x6d7)[0x7f392fdf0377]
/apps/StarPU/1.2.4/lib/libstarpu-1.2.so.4(+0x32e8a)[0x7f392fdebe8a]

/apps/StarPU/1.2.4/lib/libstarpu-1.2.so.4(_starpu_detect_implicit_da
ta_deps_with_handle+0x101)[0x7f392fdec711]

/apps/StarPU/1.2.4/lib/libstarpu-1.2.so.4(_starpu_detect_implicit_da
ta_deps+0x112)[0x7f392fdecb72]

/apps/StarPU/1.2.4/lib/libstarpu-1.2.so.4(starpu_task_submit+0x7c)[0
x7f392fde180c]
./bin/bicgstab.exe[0x40a02e]
./bin/bicgstab.exe[0x4063e2]
./bin/bicgstab.exe[0x4037f6]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f392e8d5445]
./bin/bicgstab.exe[0x403d2f]

[starpu][_starpu_task_declare_deps_array][assert failure] Task dependencies have to be set before termination (terminated 2)

bicgstab.exe: core/dependencies/task_deps.c:79: _starpu_task_declare_deps_array: Assertion `job->terminated <=1' failed.


Cette erreur arrive à ma deuxième itération, ce qui veut dire que la séquence a déjà été exécutée une fois.
Si les dépendances n'avaient pas été mises la première fois, j'aurais eu une erreur bien avant.
Donc je ne comprends pas trop cette erreur, ni comment la corriger.

Auriez-vous une idée d'où pourrait venir le problème ?

Merci beaucoup d'avance.


Le 29/06/2018 à 16:25, Samuel Thibault a écrit :
Adrien Roussel, le ven. 29 juin 2018 16:20:58 +0200, a ecrit:
Si je comprends bien, je devrais garder mon res_handle aussi bien pour mes
tâches de produits scalaires "locaux" (class StarPU_dot) que pour ma
réduction (class StarPU_reduction). C'est ça ?
Donc, un "handle" unique par données car StarPU ne va pas regarder le
pointeur du handle, juste se référer au handle lui-même avec des accesseur
différents selon ce qui est défini dans la tâche.
Oui. On ne fait pas d'analyse de valeur de pointeur, ça pose bien
trop de problème, les utilisateurs s'attendent ensuite à ce qu'on
soit capable d'analyser l'accès à un sous-tableau, et inversement on
peut vouloir enregistrer indépendemment les triangles supérieurs et
inférieurs stricts d'une même matrice.

Comme mon workflow est assez équilibré, je ne vois ce data race que pour le
produit scalaire si c'est bien ça, mais en réalité je dois en avoir partout.
C'est bien possible oui, et que ce soit juste par chance que ça ne
posait pas de problème.

Samuel



--
Adrien Roussel
Fraunhofer-Institut für
Techno- und Wirtschaftsmathematik ITWM
Fraunhofer-Platz 1, 67663 Kaiserslautern, Germany
Telefon: +49 631 31600-4984, Fax: +49 631 31600-5984
mailto: adrien.roussel@itwm.fraunhofer.de www.itwm.fraunhofer.de
#define NEW
#include <immintrin.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
#include <iostream>
#include <sstream>
#include <vector>
#define USE_STARPU
#include "Common/PerfCount.h"
#include "Partition/Partitioner.h"
#include "Matrix/CSR/CSRMatrix.h"
#include "LinearAlgebraAPI/OpenMP/OpenMPKernel.h"
#include "LinearAlgebraAPI/StarPU/StarPUKernel.h"
#include "Preconditioner/MCDiagPreconditioner.h"
#include "Solver/BiCGStab/BiCGStab.h"

//#define DEBUG

int main(int argc, char** argv)
{
  //double *x = NULL, *y = NULL;
  int nx = 100, ny = 100, nrows = 0;
  int j = 0;
  int p = 1;
  int check = 0;
  double t0 = 0., t1 = 0., duration = 0., durationSellCS = 0.;
  double norme= 0. ;

  typedef double ValueType;
  typedef CSRMatrix<ValueType> MatrixType;
  typedef std::vector<ValueType> VectorType;
  typedef RowPartitioner PartitionerType;
  typedef MCGSolver::LinearAlgebra::StarPUKernel<MatrixType, VectorType, PartitionerType> KernelType;
  //typedef MCGSolver::LinearAlgebra::OpenMPKernel<MatrixType, VectorType, PartitionerType> KernelType;
  typedef MCGSolver::BiCGStab<KernelType, MatrixType, VectorType> SolverType;
  typedef typename SolverType::Iteration IterationType;

  CSRMatrix<double> cpu_matrix;

  if(argc > 1) nx = atoi(argv[1]);
  if(argc > 2) ny = atoi(argv[2]);
  if(argc > 3) p = atoi(argv[3]);
  nrows = nx * ny;

  fprintf(stdout, "NX: %d\tNY: %d\nNrows: %d\n", nx, ny, nrows);
  fprintf(stdout, "PART: %d\n", p);

  cpu_matrix.buildLaplacian(nx,ny) ;

  RowPartitioner partition(p, nrows);
  partition.split();
  if(nrows <= 100)
    partition.print();

  KernelType omp_kernel(&partition);

  std::vector<double> x;
  std::vector<double> y;
  omp_kernel.allocate(x, nrows, true);
  omp_kernel.allocate(y, nrows, true);

  // Initialization of the RHS and unknowns vector

  typename KernelType::SeqUidType seq = omp_kernel.createNewSequence();

  //omp_kernel.mult(cpu_matrix, x, y);
  double res = 10.;
  double a = 4, b = 2;
  omp_kernel.assign(x, 5, seq);
  omp_kernel.assign(y, 1, seq);
  omp_kernel.scal(a, y, seq);
  omp_kernel.axpy(b, x, y, seq);
  omp_kernel.dot(x, y, res, seq);
  //omp_kernel.axpy(b, x, y, seq);
  omp_kernel.assertNull(res, "Prout", seq);
  for(int i = 0; i < 10; ++i)
    omp_kernel.process(seq);
  for(int i = 0; i < 10; ++i) fprintf(stdout, "(%d: %.1f) ", i, x[i]);
  fprintf(stdout, "\n");
  for(int i = 0; i < 10; ++i) fprintf(stdout, "(%d: %.1f) ", i, y[i]);
  fprintf(stdout, "\n");
  fprintf(stdout, "(x.y) = %.2f\n", res);

  #ifdef DEBUG
  cpu_matrix.print();
  #endif

  return 0;
}



Archives gérées par MHonArc 2.6.19+.

Haut de le page