Как сделать Cilk уменьшить (поток против 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 не увеличивает накладные расходы потока и не замедляет все это?
И я должен добавить ограничивать в Dest а также ЦСИ аргументы для дальнейшей помощи компилятору? или это неявно в этом случае?

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

внутренняя ошибка компилятора: в find_rank, в
с-семья / массив обозначение-common.c: 244

на

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

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

0

Решение

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

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

или же

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

1

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