Извлечение значений из массива arrayfire в виде стандартных типов и сериализации

Недавно я видел демонстрацию arrayfire на GTC и решил попробовать. Вот несколько вопросов, с которыми я столкнулся, пытаясь использовать его. Я запускаю Visual Studio 2013 в системе Windows 7 с OpenCL из AMD App SDK 2.9-1.

  1. Самое большое разочарование заключается в том, что я не могу просмотреть состояние объектов массива в отладчике, чтобы увидеть, какие данные в нем находятся. Я должен полагаться на оператор af_print. Это очень раздражает. Есть ли способ настроить отладчик, чтобы я мог видеть данные в массиве, не распечатывая их?

  2. Когда у меня есть данные в массиве, как мне вернуть значения в виде стандартных типов данных. Пример показан ниже. Я пытаюсь вернуть элемент 5,0 как двойной. Строка в примере не работает, и я не могу привести ее ни к какому стандартному типу. Единственное, что я могу назначить, это другой массив. Как мне вернуть свои данные?

    array test = constant(0, dim4(10, 2));
    test(span, 1) = 10.5;
    double val = test(5, 0);  //This does not compile. 
  1. Есть ли простой способ сериализовать/десериализовать массив на диск? Я не видел способа сделать это, и, поскольку я не могу вернуть значения в виде стандартных типов, я не знаю, как их сохранить.

  2. Я просматривал образец учебника по дождю, который вы предоставили, но, похоже, он дает неверные результаты. Например, в строке 52 есть оператор печати «af_print (дождь);». Предполагается распечатать количество осадков на каждом участке, но в нем есть все 8, что неверно. Я пробовал это как с процессором, так и с версией opencl и получил те же результаты. Некоторые другие расчеты также неверны. Код выглядит так, как будто он должен быть правильным, так это ошибка или код неправильный?


person dcofer    schedule 23.03.2015    source источник


Ответы (1)


Ответы ниже:

  1. Поскольку все данные ArrayFire находятся на графическом процессоре, их невозможно отобразить в отладчике VS (без гораздо более продвинутых методов, которые включали бы NSight или другие инструменты отладки). Альтернативный вариант — получить данные обратно на хост, а затем проверить их в отладчике (как в ответе 2).

  2. Функция host() позволяет получить данные обратно на хост. Есть 2 способа сделать это:

    // Type 1
    array a = randu(3, f32);
    float *host_a = a.host<float>();        // must call array::free() later
    printf("host_a[2] = %f\n", host_a[2]);  // last element
    af::freeHost(host_a);
    
    // Type 2
    array a = randu(3, f32);
    float *host_a = new float[3];
    a.host(host_a);
    printf("host_a[2] = %f\n", host_a[2]);  // last element
    delete [] host_a;
    
  3. ‹‹ (оператор ostream) перегружен для массивов и dim4. Таким образом, выполнение std::cout << array << std::endl; приведет к печати на экране. То же самое можно использовать с объектами fstream.

  4. Мы смотрим на осадки и вернемся. Это должно быть исправлено сегодня. Следите за нашей страницей на github.

--Редактировать-- 4. Проблема, наблюдаемая во время дождя, была исправлена ​​с помощью https://github.com/arrayfire/arrayfire/pull/531. Скоро мы выпустим новую сборку.

Редактировать 2: Измените af::free на af::freeHost, чтобы удалить память хоста, выделенную ArrayFire.

person shehzan    schedule 23.03.2015
comment
Я просто тестировал, пытаясь записать массив в файл, и то, что вы сказали в пункте 3 выше, похоже, не работает. /› std::cout ‹‹ Vm ‹‹ std::endl‹br/› ‹br/› Это не будет компилироваться. В нем говорится, что не найден оператор, который принимает правый операнд типа 'af::array' (или нет приемлемого преобразования) - person dcofer; 24.03.2015
comment
Ах, похоже, мы пропустили добавление этого обратно. Я работаю над этим прямо сейчас. Подпишитесь на github.com/arrayfire/arrayfire/issues/533. - person shehzan; 24.03.2015