2015-10-21 4 views
2

Я изучаю параллельное программирование с использованием расширения 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, а затем скопировать значения обратно в вектор. Это, вероятно, дороже, чем просто первоначальное добавление к элементу.

+0

Учитывая раздел «Нотация массива с динамически распределенными массивами» [здесь] (https://www.cilkplus.org/tutorial-array-notation), я думаю, что ваш лучший выбор - 'c.data() [0: c.size()] = a.data() [0: a.size()] + b.data() [0: b.size()] ', а затем определяет макрос, чтобы избежать ошибок копирования-вставки. – Rostislav

+0

Хорошо, это может заставить меня на правильном пути. Когда я компилирую это, я не получаю ошибку компиляции на самих линиях, но я получаю «внутреннюю ошибку компилятора: в find_rank, в c-family/array-notation-common.c: 244» в конце метода, который он помещает в , – Stershic

ответ

0

Это может быть не самый лучший/самый изящный ответ (пожалуйста, напишите альтернативы, если есть), но, похоже, он работает, чтобы использовать вышеуказанный подход №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()] 

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

Смежные вопросы