невозможно использовать cudaMemcpy с openacc

У меня есть следующий код

const int GL=100000;
Particle particles[GL];
int cp01[2][GL];
#pragma acc declare create(particles,cp01)
...

где я звоню с хоста

#pragma acc update self(cp01)
#pragma acc host_data use_device(particles) 
{ 
  cudaMemcpy(&particles[cp01[0][0]],&particles[cp01[1][0]],cp*sizeof(Particle),cudaMemcpyDeviceToDevice); 
}  

следуя совету (используйте memcpy для массивов устройств в openacc). я использую заголовок

#include <cuda_runtime.h>

использовать cudaMemcpy() и построить проект как

cmake ../src -DCMAKE_CXX_COMPILER=pgc++ -DCMAKE_CXX_FLAGS="-acc -Minfo=all"

но компилятор дает

CMakeFiles/AOS_GPU_LIFE.dir/nbody.cpp.o: In function `function_device()':
/home/70-gaa/source/GPU/AOS_GPU_LIFE_map_sort_new/nbody.cpp:175: undefined reference to `cudaMemcpy'
pgacclnk: child process exit status 1: /usr/bin/ld
CMakeFiles/AOS_GPU_LIFE.dir/build.make:94: recipe for target 'AOS_GPU_LIFE' failed
make[2]: *** [AOS_GPU_LIFE] Error 2
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/AOS_GPU_LIFE.dir/all' failed
make[1]: *** [CMakeFiles/AOS_GPU_LIFE.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

Строка 175 — это строка cudaMemcpy. Если я добавлю аргумент компилятора "-Mcuda=8.0", программа компилируется и линкуется, но когда я ее запускаю, она просто зависает без вывода в строке консоли. Может быть, я не правильно слинковал некоторые библиотеки cuda? Мой компилятор - pgc++ 17.4-0 64-битная цель на x86-64 Linux -tp sandybridge. Открыл новую тему, т.к. не смог разместить код в комментарии к предыдущей. Пожалуйста, помогите мне решить эту проблему.


person And    schedule 28.11.2017    source источник
comment
Ошибка ссылки связана с тем, что в вашей строке ссылки отсутствуют библиотеки времени выполнения CUDA, которые добавляются при добавлении флага -Mcuda=8.0. Насчет зависания не уверен. Вы можете установить переменную среды PGI_ACC_DEBUG=1, чтобы увидеть все вызовы среды выполнения OpenACC, которые могут помочь в определении места зависания. Если висит в cudaMemcpy, то я бы проверил значения cp и cp1. Если вы не можете понять это, мне нужен воспроизводящий пример, чтобы помочь.   -  person Mat Colgrove    schedule 28.11.2017


Ответы (1)


Андрей прислал мне код, и похоже, это проблема компилятора при использовании переменных, используемых в директиве "declare" в области "host_data" с добавлением опции "-Mcuda". Я отправил отчеты об этих проблемах команде компилятора PGI (TPR #24968 и #24969). Обходной путь заключается в том, чтобы поместить эти переменные в область «данных» вместо директивы «объявить».

person Mat Colgrove    schedule 29.11.2017