L'extension SIMD à C++ OpenMP dans Visual Studio

Par:
fredericmazue

mer, 03/04/2019 - 10:15

Pour les développeurs qui recherchent la performance maximale dans leur calculs parallèle en C++ avec OpenMP, ce très intéressant billet sur le blog développeur de Microsoft détaille l'état de l'art de la prise en charge de l'instruction SIMD dans l'implémentation C++ OpenMP de Visual Studio.

Single Instruction on Multiple Data (instruction unique, données multiples), ou SIMD, désigne un mode de fonctionnement des ordinateurs dotés de capacités de parallélisme. Dans ce mode, la même instruction est appliquée simultanément à plusieurs données pour produire plusieurs résultats. (Wikipedia)

OpenMP SIMP a été introduit dans le standard OpenMP 4.0 et Visual Studio 2019 en propose une implémentation, dans le but de répondre aux exigences toujours plus grandes du machine learning en termes de calculs intensifs.

Ainsi Visual Studio 2019 permet d'annoter une boucle avec une directive OpenMP SIMD, de façons à ce que le compilateur vectorise la boucle autant que possible. Le compilateur respectant l'intention d'un développeur d'avoir plusieurs itérations de la boucle exécutées simultanément.

#pragma omp simd

for (i = 0; i < count; i++)
{
    a[i] = b[i] + 1;
}

La directive OpenMP SIMD peut recevoir plusieurs clauses afin d'améliorer encore la vectorisation :

  • simdlen(length)
  • safelen(length)
  • linear(list[ linear-step])
  • aligned(list[ alignment])
  • private(list)
  • lastprivate(list)
  • reduction(reduction-identifier list)
  • collapse(n)

La directive OpenMP SIMD procure au développeur un moyen d'imposer au compilateur la vectorisation d'une boucle. Le compilateur est autorisé à ignorer la légalité apparente de cette vectorisation en acceptant la promesse d’exactitude du programmeur, précise de billet à découvrir absolument par tout développeur travaillant avec OpenMP sous Visual Studio.