Привет я пытаюсь переложить некоторые параллельные работы в MIC, используя _Cilk_Shared и _Cilk_offload.
Я объявляю общую функцию Cilk:
_Cilk_shared void somefun(int count)
В основном я вызываю эту функцию, используя
_Cilk_offload somefun(12) ;
внутри этой функции все должно быть выгружено в MIC;
Я хочу объявить редуктор Cilk внутри somefun, поэтому я могу затем использовать cilk_for и добавить в список редукторов cilk,
но я получаю ошибку:
error: illegal to declare an object of a class not marked _Cilk_shared, in a _Cilk_shared context
cilk::reducer_list_append<int> rw;
Я знаю, что могу сделать это с прагмой разгрузки, так что я должен быть в состоянии сделать это и с cilk shared, верно?
Я не могу найти конкретный пример использования _Cilk_shared и _Cilk_offload.
заранее спасибо
В основном, на что жалуется компилятор, так это то, что вы никогда не говорили ему, что ему нужно создавать код сопроцессора, а также код хоста для всех функций в классе reducer_list_append. Необходимо, но не достаточно, чтобы объявить объект rw как необходимый для сопроцессора. Также нужно сказать, что класс можно использовать на сопроцессоре.
Поскольку вы используете программирование с общей памятью, у вас, вероятно, уже есть что-то вроде следующего в вашей программе:
#pragma offload_attribute (push, _Cilk_shared)
#include <vector>
#include <offload.h>
#pragma offload_attribute (pop)
Если rw собирается в разделяемой памяти, попробуйте добавить заголовки для reducer_list_append между этими прагмами и используйте разделяемый распределитель. Если вам не нужно, чтобы rw находился в разделяемой памяти, вам не нужен разделяемый распределитель. В этом случае вы также можете поместить заголовок для класса в простую область offload_attribute вместо области _Cilk_shared offload_attribute — при условии, что нет никаких зависимостей — но если у вас уже есть область _Cilk_shared offload_attribute, вы также можете используй это. Это не повредит ничего.
Я обнаружил, что мне нужно поместить библиотеку cilk в offload_attribute _Cilk_shared:
#pragma offload_attribute (push,_Cilk_shared)
#include <cilk/cilk.h>
#include <cilk/cilk_api.h>
#include <cilk/reducer_list.h>
#pragma offload_attribute (pop)
Также …. Я нашел 2 интересных факта на данный момент:
лучше никуда не ставить #define … это даст странную ошибку во время выполнения.
Поместите #define в offload_attribute столько, сколько сможете .. если вы поместите их снаружи, иногда это вызовет странную ошибку.
Надеюсь, что Intel исправит это для посадки рыцарей.