gpt4 book ai didi

C++ AMP 在硬件上崩溃 (GeForce GTX 660)

转载 作者:太空狗 更新时间:2023-10-29 20:05:05 24 4
gpt4 key购买 nike

我在编写一些 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;
}

最佳答案

很可能您的计算超出了允许的量子时间(默认 2 秒)。在那之后操作系统进入并强制重启 GPU,这称为 Timeout Detection and Recovery (TDR) .软件适配器(引用设备)未启用 TDR,这就是计算可能超过允许的量子时间的原因。

您的计算是否真的需要 3000 个线程(变量 x),每个线程执行 2000 * 3000 (x * y) 次循环迭代?您可以对计算进行分块,这样每个分块的计算时间都不到 2 秒。您还可以考虑禁用 TDR 或超过允许的量子时间以满足您的需要。

我强烈推荐阅读一篇关于如何在 C++ AMP 中处理 TDR 的博文,其中详细解释了 TDR:http://blogs.msdn.com/b/nativeconcurrency/archive/2012/03/07/handling-tdrs-in-c-amp.aspx

此外,这是一篇关于如何在 Windows 8 上禁用 TDR 的单独博客文章: http://blogs.msdn.com/b/nativeconcurrency/archive/2012/03/06/disabling-tdr-on-windows-8-for-your-c-amp-algorithms.aspx

关于C++ AMP 在硬件上崩溃 (GeForce GTX 660),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15417583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com