#c #multithreading #g #openmp #offloading
Вопрос:
Я пытаюсь разгрузить вычисление массива с помощью GPU (GTX 1080Ti) с использованием OpenMP и C в этом фиктивном коде, который я написал:
#include <omp.h>
#include <iostream>
using namespace std;
int main(){
//int totalSum, ompSum;
int totalSum=0, ompSum=0;
const int N = 1000;
int array[N];
for (int i=0; i<N; i ){
array[i]=i;
}
#pragma omp target
{
#pragma omp parallel private(ompSum) shared(totalSum)
{
ompSum=0;
omp_set_num_threads(100);
printf ( "Total number of threads are %d!n", omp_get_num_threads() );
#pragma omp for
for (int i=0; i<N; i ){
ompSum = array[i];
}
#pragma omp critical
totalSum = ompSum;
}
printf ( "Caculated sum should be %d but is %dn", N*(N-1)/2, totalSum );
}
return 0;
}
После запуска кода я получаю следующий результат:
Total number of threads are 8!
Total number of threads are 8!
Total number of threads are 8!
Total number of threads are 8!
Total number of threads are 8!
Total number of threads are 8!
Total number of threads are 8!
Total number of threads are 8!
Caculated sum should be 499500 but is 499500
Рассчитанная сумма верна, но мне любопытно, почему она показывает только 8 потоков по сравнению со 100 потоками, которые я установил в коде.
При установке omp_set_num_threads
справа ниже #pragma omp target
, среда выполнения сообщит
libgomp: cuCtxSynchronize error: an illegal memory access was encountered
Я новичок в OpenMP, я был бы очень признателен, если бы кто-нибудь мог помочь объяснить эту проблему.
Комментарии:
1. Недопустимо устанавливать количество потоков внутри параллельной области.
2. @paddy Я попробовал сидеть снаружи, тоже без изменений
3. Вы уверены, что правильно настроили графический процессор (и действительно ли OpenMP использует его)? Пожалуйста, проверьте возвращаемое значение
int omp_is_initial_device(void);
функции внутриtarget
региона. Если возвращаемое значение равно 0, то вы запускаете этот код на GPU, в противном случае на CPU.4. Он возвращает значение 0, которое, как я предполагаю, является GPU @Laci
5. Зачем нужно устанавливать количество потоков GPU? AFAIK, GCC будет использовать один поток для каждой основы, поэтому правильное написание директивы разгрузки будет
#pragma omp target teams distribute parallel for simd reduction( :totalSum) map(from:totalSum) map(to:array[:N])