Я изучаю параллельное программирование с использованием расширения Cilk Plus для C++ (на gcc). Один из простейших рефакторингов, о котором я читал, - это использовать нотацию массива Cilk, а именно использовать ее, выполняющую независимые от вектора операции вектора.Использование обозначений массива Cilk и векторов STL
т.е .: 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 and length fields necessary for using array notations in pointers or records
Я понимаю, что подход # 2 делает указатель на вектор без информации о длине, но есть ли какое-либо обходное решение?
Редактировать:
Лучшее решение является предпочтительным. Может быть возможно, например, определить массив и использовать std::copy
для копирования значений из вектора в массив, выполнить добавление с использованием нотации массива Cilk, а затем скопировать значения обратно в вектор. Это, вероятно, дороже, чем просто первоначальное добавление к элементу.
Учитывая раздел «Нотация массива с динамически распределенными массивами» [здесь] (https://www.cilkplus.org/tutorial-array-notation), я думаю, что ваш лучший выбор - 'c.data() [0: c.size()] = a.data() [0: a.size()] + b.data() [0: b.size()] ', а затем определяет макрос, чтобы избежать ошибок копирования-вставки. – Rostislav
Хорошо, это может заставить меня на правильном пути. Когда я компилирую это, я не получаю ошибку компиляции на самих линиях, но я получаю «внутреннюю ошибку компилятора: в find_rank, в c-family/array-notation-common.c: 244» в конце метода, который он помещает в , – Stershic