аварийное завершение Visual C ++ AMP на оборудовании (GeForce GTX 660)

У меня проблемы с написанием кода на C ++ AMP. Я включил образец.
Он отлично работает на эмулируемых ускорителях, но вылетает драйвер дисплея на моем оборудовании (Windows 7, NVIDIA GeForce GTX 660, последние драйверы), но я не вижу ничего плохого в своем коде.

Есть ли проблема с моим кодом или это проблема аппаратного обеспечения / драйвера / компилятора?

#include "stdafx.h"
#include <vector>
#include <iostream>
#include <amp.h>

int _tmain(int argc, _TCHAR* argv[])
{
// Prints "NVIDIA GeForce GTX 660"concurrency::accelerator_view target_view = concurrency::accelerator().create_view();
std::wcout << target_view.accelerator.description << std::endl;

// lower numbers do not cause the issue
const int x = 2000;
const int y = 30000;

// 1d array for storing result
std::vector<unsigned int> resultVector(y);
Concurrency::array_view<unsigned int, 1> resultsArrayView(resultVector.size(), resultVector);

// 2d array for data for processing
std::vector<unsigned int> dataVector(x * y);
concurrency::array_view<unsigned int, 2> dataArrayView(y, x, dataVector);
parallel_for_each(
// Define the compute domain, which is the set of threads that are created.
resultsArrayView.extent,
// Define the code to run on each thread on the accelerator.
[=](concurrency::index<1> idx) restrict(amp)
{
concurrency::array_view<unsigned int, 1> buffer = dataArrayView[idx[0]];
unsigned int bufferSize = buffer.get_extent().size();

// needs both loops to cause crash
for (unsigned int outer = 0; outer < bufferSize; outer++)
{
for (unsigned int i = 0; i < bufferSize; i++)
{
// works without this line, also if I change to buffer[0] it works?
dataArrayView[idx[0]][0] = 0;
}
}
// works without this line
resultsArrayView[0] = 0;
});

std::cout << "chash on next line" << std::endl;
resultsArrayView.synchronize();
std::cout << "will never reach me" << std::endl;

system("PAUSE");
return 0;
}

3

Решение

Весьма вероятно, что ваши вычисления превышают допустимое квантовое время (по умолчанию 2 секунды). По истечении этого времени операционные системы входят и принудительно перезапускают графический процессор, это называется Тайм-аут обнаружения и восстановления (TDR). Программный адаптер (эталонное устройство) не имеет включенного TDR, поэтому вычисление может превышать допустимое квантовое время.

Ваши вычисления действительно требуют 3000 потоков (переменная x), каждый из которых выполняет 2000 * 3000 (x * y) итераций цикла? Вы можете разделить ваши вычисления так, чтобы каждому фрагменту потребовалось менее 2 секунд. Вы также можете рассмотреть возможность отключения TDR или превышения разрешенного квантового времени в соответствии с вашими потребностями.

Я настоятельно рекомендую прочитать сообщение в блоге о том, как обрабатывать TDR в C ++ AMP, в котором подробно объясняется TDR: http://blogs.msdn.com/b/nativeconcurrency/archive/2012/03/07/handling-tdrs-in-c-amp.aspx

Кроме того, вот отдельное сообщение в блоге о том, как отключить TDR в Windows 8:
http://blogs.msdn.com/b/nativeconcurrency/archive/2012/03/06/disabling-tdr-on-windows-8-for-your-c-amp-algorithms.aspx

8

Другие решения

Других решений пока нет …