#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’ не является потокобезопасным, поэтому его не следует использовать в параллельном контексте, хосте или устройстве.