Использование обозначения массива Cilk и векторов STL

Я изучаю параллельное программирование, используя расширение Cilk Plus для C ++ (на gcc). Один из простейших рефакторингов, о которых я читал, — это использовать обозначение массива Cilk, а именно использовать его для выполнения независимых от порядка векторных операций.

т.е .: c[:] = a[:] + b[:]

скорее, чем: for (unsigned i = 0; i < a.size(); ++i) c[i] = a[i] + b[i];

У меня большой код на месте, интенсивно использующий std::vector объекты, а не массивы. Можно ли использовать эту концепцию с std::vector?

принимая во внимание a, b, а также c быть std::vector<double> равной длины, я попробовал это без успеха:

1.

c[:] = a[:] + b[:]

2.

double* aArr = &a[0];
double* bArr = &b[0];
double* cArr = &c[0];
cArr[:] = aArr[:] + bArr[:]

Оба возвращаются

поля start-index и length, необходимые для использования обозначений массива в указателях или записях

Я понимаю, что подход № 2 делает указатель на вектор без информации о длине, но есть ли обходной путь?

Редактировать:

Эффективное решение является предпочтительным. Может быть возможно, например, определить массив и использовать std::copy чтобы скопировать значения из вектора в массив, выполните сложение, используя обозначение массива Cilk, а затем скопируйте значения обратно в вектор. Это, вероятно, дороже, чем просто сделать оригинальное поэлементное дополнение.

2

Решение

Это может быть не самый лучший / самый элегантный ответ (пожалуйста, опубликуйте альтернативы, если таковые имеются), но кажется, что он работает с использованием вышеуказанного подхода № 2 с указанием начала / длины индекса. Как это:

double* aArr = &a[0];
double* bArr = &b[0];
double* cArr = &c[0];
cArr[0:c.size()] = aArr[0:c.size()] + bArr[0:c.size()]

Конечно, мне нужно быть осторожным, чтобы длины векторов совпадали, но он компилируется, и, похоже, возвращает те же ответы.

0

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

Других решений пока нет …