Неразрешенная внешняя функция OpenACC

#linker #openacc

#компоновщик #openacc

Вопрос:

Я пытаюсь оптимизировать проблему с помощью OpenACC, однако есть некоторые базовые функции, которые задаются как подпрограммы. Основная проблема, с которой я сталкиваюсь, связана с calloc функцией, в конце которой отображается следующая ошибка:

ptxas фатальный: неразрешенная внешняя функция ‘calloc’

Используемая команда для компиляции:

 pgcc acc.c -acc -Minfo=accel -ta=nvidia:cc60,nordc -o acc
  

Ранее я пробовал без флага nordc, однако возникла эта ошибка:

ошибка nvlink: неопределенная ссылка на ‘calloc’ в ‘/tmp/pgccqWXdW9NTZXUL.o’

ошибка nvlink: неопределенная ссылка на ‘rand’ в ‘/tmp/pgccqWXdW9NTZXUL.o

Ответ №1:

Многие системные вызовы недоступны на устройстве. Хотя вы могли бы заменить ‘calloc’ на ‘malloc’, который доступен, я бы настоятельно рекомендовал не выделять в коде устройства. Помимо того, что он очень медленный, куча устройств довольно мала (~ 32 МБ). Вам будет лучше, если вы сможете реорганизовать свой алгоритм, чтобы динамически не распределять данные на устройстве.

Для «rand» вам нужно вызвать «cuRAND». Если вы используете PGI, мы отправляем примеры того, как вызывать cuRAND в каталоге «$PGI / 2018/examples / CUDA-Libraries / curand». Обратите внимание, что ‘rand’ не является потокобезопасным, поэтому его не следует использовать в параллельном контексте, хосте или устройстве.