ArrayFire seq в int c ++

Представьте себе gfor с последовательностью j ...

Если мне нужно использовать значение экземпляра j в качестве индекса, кто я могу это сделать?

что-то вроде:

vector<double> a(n);
gfor(seq j, n){
    //Do some calculation and save this on someValue
    a[j] = someValue;
}

Кто-нибудь может мне помочь (снова)? Спасибо.


person Lucas Amparo Barbosa    schedule 27.06.2017    source источник


Ответы (2)


Я нашел решение для этого ...

если у кого-то был вариант получше, не стесняйтесь размещать ...

Сначала создайте последовательность с таким же размером, что и ваши экземпляры gfor. Затем преобразуйте этот seq в массив. Теперь возьмите значение этой строки в массиве (оно равно индексу)

seq sequencia(0, 200);
af::array sqc = sequencia;

//Inside the gfor loop
countLoop = (int) sqc(j).scalar<float>();
person Lucas Amparo Barbosa    schedule 27.06.2017

Ваш подход работает, но нарушает gfors распараллеливание, поскольку преобразование индекса в скаляр вынуждает его записывать из графического процессора обратно на хост, что приводит к нарушению работы графического процессора.

Вы хотите сделать это примерно так:

af::array a(200);
gfor(seq j, 200){
   //Do some calculation and save this on someValue
   a[j] = af::array(someValue);  // for someValue a primitive type, say float
}
// ... Now we're safe outside the parallel loop, let's grab the array results
float results[200];
a.host(results)  // Copy array from GPU to host, populating a c-type array
person Christopher Reiss    schedule 26.07.2017