Я изучаю параллельное программирование, используя расширение 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 с указанием начала / длины индекса. Как это:
double* aArr = &a[0];
double* bArr = &b[0];
double* cArr = &c[0];
cArr[0:c.size()] = aArr[0:c.size()] + bArr[0:c.size()]
Конечно, мне нужно быть осторожным, чтобы длины векторов совпадали, но он компилируется, и, похоже, возвращает те же ответы.
Других решений пока нет …