Как выполняется сокращение cilk (thread vs. smid)

У меня есть что-то вроде этого:

  for (b=from; b<to; b++) 
  {
    for (a=from2; a<to2; a++) 
    {
      dest->ac[b] += srcvec->ac[a] * srcmatrix->weight[a+(b+from)*matrix_width];
    }
  }

что я хотел бы распараллелить с помощью cilk. Я написал следующий код:

for ( b=from; b<to; b++) 
{
  dest->ac[b] =+  __sec_reduce_add(srcvec->ac[from2:to2-from2] * (srcmatrix->weight+(b*matrix_width))[from2:to2-from2]);
}

но дело в том, что я мог бы использовать cilk_for в основном цикле, но если операция сокращения уже порождает поток, не будет ли cilk_for увеличивать накладные расходы потока и замедлять все это? И должен ли я добавить restrict в аргументы dest и src, чтобы помочь компилятору? или это подразумевается в этом случае?

(ps: я не могу попробовать код прямо сейчас из-за

внутренняя ошибка компилятора: в find_rank, в c-family/array-notation-common.c:244

on

neu1b->ac[0:layer1_size]=neu1->ac[0:layer1_size];

что я тоже пытаюсь решить.)


person Arkantus    schedule 14.08.2015    source источник
comment
ошибка в первом фрагменте кода, а именно dest[b+from]?   -  person Les    schedule 14.08.2015
comment
Ошибка компилятора устранена с помощью временной переменной. авто t = neu1->ac; авто tb = neu1b->ac; tb[0:размер_слоя1]=t[0:размер_слоя1];   -  person Arkantus    schedule 14.08.2015
comment
@Les Исправлено, спасибо.   -  person Arkantus    schedule 14.08.2015


Ответы (1)


restrict не является неявным. Кроме того, Cilk реализуется с использованием концепции воркования. Cilk не обязательно создает дополнительные потоки для дополнительной работы. Он работает с отправкой задач в рабочий стек. Дополнительную информацию о внутренней работе можно найти в разделе Часто задаваемые вопросы Cilk. Компилятор Intel может работать иначе, чем GCC с Cilk. Intel vTune и отчет о векторизации Intel могут помочь вам измерить разницу в производительности и указать, скомпилирован ли он в SIMD или нет. С помощью компилятора Intel вы также можете указать операции SIMD следующим образом:

#pragma simd над вашей петлей

or

обозначения массивов: a[:] = b[:] + c[:] для программирования операций с векторизованными массивами.

person abort    schedule 14.08.2015