Могу ли я использовать `omp_get_thread_num()` на графическом процессоре?

У меня есть код OpenMP, который работает на ЦП, так как каждый поток управляет памятью, адресованной номером идентификатора потока, доступного через omp_get_thread_num(). Это хорошо работает на процессоре, но может ли это работать на графическом процессоре?

MWE это:

#include <iostream>
#include <omp.h>

int main(){
  const int SIZE = 400000;

  int *m;
  m = new int[SIZE];

  #pragma omp target
  {
    #pragma omp parallel for
    for(int i=0;i<SIZE;i++)
      m[i] = omp_get_thread_num();
  }

  for(int i=0;i<SIZE;i++)
    std::cout<<m[i]<<"\n";
}

person Richard    schedule 23.12.2017    source источник


Ответы (2)



Он отлично работает на графическом процессоре для меня с GCC. Вам нужно сопоставить m, например. как это

#pragma omp target map(tofrom:m[0:SIZE])

я так компилировал

g++ -O3 -Wall -fopenmp -fno-stack-protector so.cpp

Вы можете увидеть пример для системы без разгрузки здесь

http://coliru.stacked-crooked.com/a/1e756410d6e2db61

Метод, который я использую, чтобы узнать количество команд и потоков перед выполнением работы, таков:

#pragma omp target teams defaultmap(tofrom:scalar)
{
    nteams = omp_get_num_teams();
    #pragma omp parallel
    #pragma omp single
    nthreads = omp_get_num_threads();
}

В моей системе с GCC 7.2, Ubuntu 17.10 и gcc-offload-nvptx с GTX 1060 я получаю nteams = 30 и nthreads = 8. См. этот ответ, где я делаю собственное сокращение для целевого региона, используя потоки и команды. С -offload=disable nteams = 1 и nthreads = 8 (процессор с 4 ядрами/8 аппаратными потоками).


Я добавил -fopt-info в параметры компиляции, и я получаю только сообщение

note: basic block vectorized
person Z boson    schedule 12.03.2018

Ответ, кажется, нет.

Компиляция с PGI с использованием:

pgc++ -fast -mp -ta=tesla,pinned,cc60 -Minfo=all test2.cpp

дает:

13, Parallel region activated
    Parallel loop activated with static block schedule
    Loop not vectorized/parallelized: contains call
14, Parallel region terminated

тогда как компиляция с помощью GCC с использованием

g++ -O3 test2.cpp -fopenmp -fopt-info

дает

test2.cpp:17: note: not vectorized: loop contains function calls or data references that cannot be analyzed
test2.cpp:17: note: bad data references.
person Richard    schedule 23.12.2017