cl :: vector против std :: vector: другое поведение итератора - PullRequest
4 голосов
/ 31 января 2012

РЕДАКТИРОВАТЬ: Добавлен вывод отладочной информации с местами памяти, как предложено PlasmaHH.

Я не понимаю различное поведение cl :: vector <> в привязках C ++ для OpenCL,Рассмотрим следующий код:

Заголовок Top.hpp:

class Top {
public:
    void setBool(bool b);
    bool getBool();
private:
    bool status;
};

Источник Top.cpp:

#include "Top.hpp"   

void Top::setBool(bool b) {
    std::cout << (void*)this << " setBool("<< b<< ")\n";
    status = b;
}

bool Top::getBool() {
    std::cout << (void*)this << " getBool() returns " << status << std::endl;
    return status;
}

Используйте приведенное выше:

#define __NO_STD_VECTOR

#include <iostream>
#include "CL/cl.hpp"
#include "Top.hpp"

using namespace cl;
using namespace std;

cl::vector<Top> js;

int main() {
    js.push_back(Top());
    js[0].setBool(true);
    cout << js[0].getBool() << endl;
    for(cl::vector<Top>::iterator i = js.begin(); i != js.end(); ++i) {
        (*i).setBool(false);
    }
    cout << js[0].getBool() << endl;
}

При __NO_STD_VECTOR std :: vector переопределяется.Выходные данные

0x6021c0 setBool(1)
0x6021c0 getBool() returns 1
0x7fffae671d60 setBool(0)
0x6021c0 getBool() returns 1

Таким образом, местоположение, возвращаемое итератором, определенно неверно.

Использование вышеприведенного с std::vector (и, конечно, изменение пространств имен на std) дает ожидаемый результат:

0x1be0010 setBool(1)
0x1be0010 getBool() returns 1
0x1be0010 setBool(0)
0x1be0010 getBool() returns 0

Этот итератор действует по-другому, но он должензаменить std :: vector, чтобы избежать проблем совместимости.Я что-то упустил?

Ответы [ 2 ]

4 голосов
/ 31 января 2012

Не опытный специалист по OpenCL, как бы то ни было, но мне это интересно, поэтому я перешел к CUDA / OpenCL Computing .Похоже, их оператор * возвращает копию, а не ссылку:

00706         T operator *()
00707         {
00708             return vec_[index_];
00709         }

В то время как (первый, неконстантный) оператор вектора [] возвращает ссылку:

00621     T& operator[](int index)
00622     {
00623         return data_[index];
00624     }
00625   
00626     T operator[](int index) const
00627     {
00628         return data_[index];
00629     }

Попробуйтеитерация по вектору напрямую (используя старое «int i = 0, ...») и посмотреть, дает ли это разные результаты.Если это так, вы можете добавить отчет об ошибке (проверьте сначала), так как это неожиданное поведение для оператора *.

1 голос
/ 31 января 2012

Судя по адресам, я подозреваю, что это 64-битная сборка и что operator* итератора вектора cl возвращается по значению, а не по ссылке, не разрешая доступ к исходному элементу. В качестве эксперимента вы можете попробовать использовать оператор -> вместо i->setBool(false);, чтобы проверить, насколько это реализовано.

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