У меня есть что-то подобное:
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];
что я тоже пытаюсь решить.)
restrict
это не имплицитный случай. Кроме того, Cilk реализован с использованием работа краже концепция. Cilk не обязательно порождает дополнительные темы для дополнительной работы. Работает с заданиями на стек. Более подробную информацию о внутренней работе можно найти на Cilk FAQ. Компилятор Intel может работать с Cilk иначе, чем GCC. Intel vTune и отчет Intel векторизации могут помочь вам измерить различия в производительности и определить, скомпилирован ли он в SIMD или нет. С помощью компилятора Intel вы также можете указать операции SIMD следующим образом:
#pragma simd
над вашей петлей
или же
обозначения массива:
a[:] = b[:] + c[:]
программировать операции векторизованного массива.