Почему выгрузка с использованием _Cilk_offload требует, чтобы каждая функция была _Cilk_shared?

Я объявил некоторые глобальные переменные _Cilk_shared. Они используются в функциях, которые я хочу разгрузить. Они используются в некоторых функциях, которые я не хочу выгружать.

Поэтому изначально я объявил только те функции, которые мне нужно разгрузить, как _Cilk_shared и вызвал эти функции с помощью _Cilk_offload.

Компилируется нормально. И когда я запускаю его только на хосте, это дает правильный результат.

Затем я запускаю его с помощью микрофона. это дает мне ошибку во время выполнения о невозможности загрузки библиотеки неопределенного неопределенного символа, за которым следуют имена функций, которые я не объявил как _cilk_shared. Эти функции также не обязательно должны быть _cilk_shared.

Поэтому я должен изменить эти функции на _cilk_shared. Запустите это снова. На этот раз MIC дает правильный результат.

И я проверил, выгружены ли эти функции (которые я не хотел разгрузить и изначально не объявлял как _cilk_shared), используя

#ifdef __MIC__
printf(" Running on MIC\n");
#else
printf("No MIC\n");
#endif

В результате они не выгружаются ….

Поэтому мне интересно, почему он хочет, чтобы я объявил эти функции как _Cilk_shared?

0

Решение

Когда функция объявлена ​​для разгрузки —
если функция определена в этом файле, компилятор генерирует
объектный код, который будет работать на процессоре, и объектный код, который будет
запустить на сопроцессоре.
если функция используется в этом файле, она
генерирует объектный код, который будет вызывать версию и код процессора
это вызовет версию сопроцессора (если вызов не находится внутри
область, защищенная » ifdef микрофон«

Так почему загрузчик может захотеть, чтобы функция была объявлена ​​для разгрузки, даже если вы никогда не вызывали ее в выгруженном регионе?
Хорошо, если функция является частью класса, тогда весь класс должен быть объявлен для разгрузки, потому что класс «знает», какие функции являются его частью. Когда вы загружаете объектный код для класса, вы загружаете весь класс. В этом случае, если вы собираетесь делиться объектами этого класса, он должен быть объявлен как _Cilk_shared.

Вы можете столкнуться с подобными проблемами, если функции находятся в динамически связанной библиотеке. Динамически связанная библиотека «знает», какие функции являются ее частью, и «знает», какие функции ей требуются. Поэтому, когда вы запускаете свой код, загрузчик хочет найти все файлы, которые библиотека «знает», в которых она нуждается. В этом случае самое простое — просто сделать выгруженные версии всех библиотек. Другие вещи, которые вы можете попробовать — попробуйте статически связать библиотеку, содержащую эти файлы, или попробуйте создать библиотеки, которые «не знают», что им нужно то, что им действительно не нужно — разбейте вашу библиотеку на части или попробуйте явно создать отдельную версию хоста и сопроцессора библиотека, как и в случае с кодом, который вы собираетесь запустить на сопроцессоре.

Если это не объясняет, что вы видите, дайте мне знать.

0

Другие решения


По вопросам рекламы [email protected]