Использование редуктора Cilk внутри разделяемой функции Cilk

Привет я пытаюсь переложить некоторые параллельные работы в 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.

заранее спасибо

0

Решение

В основном, на что жалуется компилятор, так это то, что вы никогда не говорили ему, что ему нужно создавать код сопроцессора, а также код хоста для всех функций в классе 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, вы также можете используй это. Это не повредит ничего.

0

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

Я обнаружил, что мне нужно поместить библиотеку 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 интересных факта на данный момент:

  1. лучше никуда не ставить #define … это даст странную ошибку во время выполнения.

  2. Поместите #define в offload_attribute столько, сколько сможете .. если вы поместите их снаружи, иногда это вызовет странную ошибку.

Надеюсь, что Intel исправит это для посадки рыцарей.

0