我正在研究C++中的高性能代码,并且一直在使用CUDA和OpenCL以及最近的C++ AMP,我非常喜欢它.然而,我有点担心它没有被开发和扩展并且将会消亡.
让我想到这个想法的是,即使是MS C++ AMP博客已经沉默了大约一年.看看C++ AMP算法库http://ampalgorithms.codeplex.com/wikipage/history,似乎一年多没发生任何事情.
我看到的唯一开发是现在LLVM类型支持C++ AMP,因此它不仅仅是Windows,但这就是全部,而不是已被广泛讲述的东西.
你知道什么样的工作,如果有的话?
restrict是一个C99功能,它最近得到了很多关注,允许编译器对指针执行"以前只有fortran"的优化.这也是微软最近宣布的与C++ AMP规范基础相同的关键词.
该关键字实际上是在FCD中吗?如果没有,是否有特定原因被省略?
有谁知道,如果有任何计划发展以g ++语言支持(GCC)为新的C++ AMP标准,该标准被释放最近被微软作为一个开放的规范?我看到有人已在他们的论坛上询问英特尔支持.但是我没有看到GCC的任何东西.
我读到微软正在与Nvidia密切合作,以提高AMP的性能.
但我的问题是:AMP是CUDA - 被微软取代吗?或者当NVIDIA CUDA视频卡可用时,AMP是否使用CUDA驱动程序?AMP是openCL的替代品吗?
我还是很困惑..
我刚刚开始学习C++ AMP,并且我已经获得了一些我用VS 2012 RC构建的示例,但我发现GPU的性能比CPU慢.例如,Kate Gregory的例子:http://ampbook.codeplex.com/releases/view/90595(与她即将出版的书http://www.gregcons.com/cppamp/相关).她在演讲中展示了她们,通过使用她的笔记本电脑的GPU(我相信她说它是6650)与CPU(不知道她有什么CPU)相比,她在第四章的例子中获得了约5倍的性能提升.我已经尝试过自己测试这个例子以及几个系统配置(如下所示)我总是发现CPU更快.我还测试了其他例子并发现了相同的例子.难道我做错了什么?性能低于预期的原因是否有原因?有没有人有一个肯定会表明GPU更快的例子?
结果示例:chapter4项目结果为1.15ms CPU,2.57ms GPU,2.55ms GPU平铺.
编辑:
Doh,我想我刚刚找到了原因 - 她在讲座中使用的矩阵大小的值是不同的.网站上的样本使用M = N = W = 64.如果我像在演讲中那样使用64,512和256,那么我的性能会相应提高~5倍.
我在看这个视频由香草萨特对GPGPU和新的C++ AMP库.他正在谈论内存模型,并提到弱内存模型,然后是强内存模型,我认为他指的是读/写顺序等,但我不确定.
谷歌在内存模型上发现了一些有趣的结果(主要是科学论文),但有人可以解释什么是弱内存模型,什么是强内存模型及其与并发的关系?
在C++ AMP中,内核函数或lambda标记为restrict(amp),这对C++的允许子集(此处列出)施加了严格的限制.CUDA是否允许内核函数中C或C++子集的更多自由?
我知道C++ AMP由支持DirectX 11的GPU加速.
但是,我的问题是,如果编译的C++ AMP程序在没有DirectX 11兼容GPU的机器上运行,会发生什么?
是否可以通过DirectCompute的某些软件实现来模拟?
它是否在CPU上执行(可能使用SSE样式指令)?
或者,它是否无法执行?
我正在试验F#中的C++ AMP库,作为使用GPU并行工作的一种方式.但是,我得到的结果似乎并不直观.
在C++中,我创建了一个带有一个函数的库,它使用AMP对数组中的所有数字进行平方:
extern "C" __declspec ( dllexport ) void _stdcall square_array(double* arr, int n)
{
// Create a view over the data on the CPU
array_view<double,1> dataView(n, &arr[0]);
// Run code on the GPU
parallel_for_each(dataView.extent, [=] (index<1> idx) restrict(amp)
{
dataView[idx] = dataView[idx] * dataView[idx];
});
// Copy data from GPU to CPU
dataView.synchronize();
}
Run Code Online (Sandbox Code Playgroud)
(代码改编自Igor Ostrovsky 在MSDN上的博客.)
然后我编写了以下F#来比较任务并行库(TPL)和AMP:
// Print the time needed to run the given function
let time f =
let s = new …Run Code Online (Sandbox Code Playgroud) 我在 C++ AMP 中处理大型数组(超过 65536 个元素)时遇到问题。我正在使用 C++ amp 来计算多边形列表的法线、切线和双切线向量。输入由位置数组(每个位置 3 个浮点数)和 uv 坐标数组(每个顶点 2 个浮点数)组成。在我的parallel_for_each函数中,我计算法线、切线和双切线(每组3个顶点各1个)。我将它们写回数组(封装在 array_view 中)。该算法如下所示:
concurrency::extent<2> ePositions(positionsVector.size() / 3, 3);
concurrency::array_view<const float, 2> positions(ePositions, positionsVector);
concurrency::extent<2> eUVs(uvsVector.size() / 2, 2);
concurrency::array_view<const float, 2> UVs(eUVs, uvsVector);
concurrency::extent<2> eNormalDirections(normalDirectionsVector.size() / 3, 3);
concurrency::array_view<float, 2> normalDirections(eNormalDirections, normalDirectionsVector);
normalDirections.discard_data();
concurrency::extent<2> eTangentDirections(tangentDirectionsVector.size() / 3, 3);
concurrency::array_view<float, 2> tangentDirections(eTangentDirections, tangentDirectionsVector);
tangentDirections.discard_data();
concurrency::extent<2> eBitangentDirections(bitangentDirectionsVector.size() / 3, 3);
concurrency::array_view<float, 2> bitangentDirections(eBitangentDirections, bitangentDirectionsVector);
bitangentDirections.discard_data();
concurrency::parallel_for_each(eNormalDirections.tile<1, 3>(), [=](concurrency::tiled_index<1, 3> t_idx) restrict(amp)
{
< ... calculate the normals, tangents …Run Code Online (Sandbox Code Playgroud) c++-amp ×10
c++ ×7
gpgpu ×4
c++11 ×2
cuda ×2
arrays ×1
concurrency ×1
f# ×1
memory-model ×1
opencl ×1
visual-c++ ×1