C++ AMP в Visual Studio 2015: ошибка компилятора/среды выполнения или образец ошибки?

Я хотел бы попробовать следующий пример кода C++ AMP из документации Microsoft:

(Второй пример кода на https://msdn.microsoft.com/en-us/library/hh265136.aspx, немного адаптированный для превращения в программу):

#include "stdafx.h"

#include <amp.h>
#include <iostream>
using namespace concurrency;

const int size = 5;

void CppAmpMethod() {
    int aCPP[] = { 1, 2, 3, 4, 5 };
    int bCPP[] = { 6, 7, 8, 9, 10 };
    int sumCPP[size];

    // Create C++ AMP objects.
    array_view<const int, 1> a(size, aCPP);
    array_view<const int, 1> b(size, bCPP);
    array_view<int, 1> sum(size, sumCPP);
    sum.discard_data();

    parallel_for_each(
        // Define the compute domain, which is the set of threads that are created.
        sum.extent,
        // Define the code to run on each thread on the accelerator.
        [=](index<1> idx) restrict(amp)
    {
        sum[idx] = a[idx] + b[idx];
    }
    );

    // Print the results. The expected output is "7, 9, 11, 13, 15".
    for (int i = 0; i < size; i++) {
        std::cout << sum[i] << "\n";
    }
}


int main()
{
    CppAmpMethod();
    return 0;
}

К сожалению, при компиляции (с использованием Visual Studio 2015) и выполнении это вызывает исключение времени выполнения для первой из конструкций array_view.

'ConsoleApplication2.exe' (Win32): Loaded 'C:\Windows\SysWOW64\nvwgf2um.dll'. Cannot find or open the PDB file.
'ConsoleApplication2.exe' (Win32): Loaded 'C:\Windows\SysWOW64\psapi.dll'. Cannot find or open the PDB file.
Exception thrown at 0x0F9CC933 (vcamp140d.dll) in ConsoleApplication2.exe: 0xC0000005: Access violation reading location 0xCDCDCDCD.

Мне интересно, как такой простой пример кода мог так сильно потерпеть неудачу. Это пример кода неверен или это компилятор? Конечно, это также может быть что-то особенное для моей системы, поскольку, в конце концов, использование C++ AMP может включать низкоуровневое взаимодействие с графическим драйвером и т. д., что может вызвать там ошибки. Любая помощь будет принята с благодарностью!


person Morty    schedule 13.09.2015    source источник
comment
То же самое здесь с Windows 7 и Visual Studio 2015 версии 14.0.23107.0 D14REL. Работает под релизом.   -  person user2023370    schedule 19.04.2016
comment
Хорошо на другом компьютере с Windows 7 и Visual Studio 2015 версии 14.0.24720.00 с обновлением 1.   -  person user2023370    schedule 21.04.2016
comment
Прошло 4 года, ничего не изменилось, VS2019 на Win10.   -  person Bear Vast    schedule 08.07.2019
comment
Грустно — даже если драйверы и т. д. вовлечены в явление ошибки, это по-прежнему означает, что AMP API в основном бесполезен для любого использования клиентских приложений, учитывая, что простейший образец программы от Microsoft не работает на основных машинах.   -  person Morty    schedule 05.08.2019
comment
Что ж, прошло 4 года, поэтому попробовал снова в VS2019. Теперь он даже не компилируется (amp.h(2616): ошибка C3861: '_Access': идентификатор не найден)! т.е. синтаксические ошибки в самом заголовочном файле amp.h. Ошибка не устранена путем изменения порядка или включения сначала Windows.h или чего-либо подобного. Судя по всему, исправление находится в разработке (май 19 года): developercommunity.visualstudio.com/content/problem/200035/. Интересно, сколько из них используют C++ AMP? И сколько испытаний он получает? ;)   -  person Morty    schedule 23.08.2019


Ответы (3)


Вы должны изменить тип отладчика на Только графический процессор.

Пожалуйста, посмотрите на скриншот:

введите здесь описание изображения

person Cloud Wu    schedule 19.11.2015

Это, вероятно, ключ:

«поскольку, в конце концов, использование C++ AMP может включать низкоуровневое взаимодействие с графическим драйвером и т. д., что может вызвать там ошибки».

Образец должен работать, но у вас должны быть правильные драйверы для DirectX11.

Возможно, вы попытаетесь отладить сборку с помощью программного эмулятора. Если вы используете Windows 8 или более позднюю версию, попробуйте изменить свойства в обозревателе решений в разделе отладки и просмотрите параметры, доступные в списке типов отладчика. Посмотрите, поможет ли НЕ использовать только GPU.

person JVene    schedule 13.09.2015
comment
Привет, спасибо - к сожалению, я не могу найти опцию, касающуюся только графического процессора и т. д., в обозревателе решений. Единственное, что я смог найти при отладке, это параметр ускорителя Amp по умолчанию, который можно установить либо на ускоритель программного обеспечения WARP (который уже был в нем), либо на использование C++ AMP по умолчанию во время выполнения. Я попытался изменить его на последний, но точно такая же ошибка все еще существует. Кроме того, кажется, что исходная настройка уже заключалась в использовании программного обеспечения (вероятно, потому что проект находится в режиме отладки). - person Morty; 14.09.2015
comment
Может ли кто-нибудь попробовать приведенный выше пример в своей системе? Спасибо! - person Morty; 14.09.2015

У меня была точно такая же проблема, отладочная сборка вызвала исключение (выпускная сборка не сработала). Решение, которое сработало для меня, было обновить (восстановить установку) Visual Studio, даже если у меня была последняя сборка 2015, обновление 3, а затем установить новейшую графику водители. Я не знаю, что было основной причиной, но я думаю, что графические драйверы...

person Pauli    schedule 15.11.2016