gpt4 book ai didi

C++ AMP 很慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:38 25 4
gpt4 key购买 nike

我在 C++ 中有以下代码:

float Neuron::feedForward(std::vector<Neuron>& previousLayer){
float sum=0.0f;
for(int i=0;i<(int)previousLayer.size();i+=1){
sum+=previousLayer[i].getOutput()*weigths[i];
}
output=Neuron::transferFunction(sum);
return output;

};

我转换成这个:

float Neuron::feedForward(std::vector<Neuron>& previousLayer){
float sum=0.0f;
extent<1> e((int)previousLayer.size());

std::vector<float> ops(previousLayer.size());
for (int i = 0; i<(int)previousLayer.size(); i += 1) {
ops[i] = previousLayer[i].getOutput();
}

array_view<const float, 1>_outputs(e, ops);
array_view<const float, 1>_weigths(e, weigths);
array_view<float> _sum(e);
_sum.discard_data();


parallel_for_each(e, [=](index<1> idx) restrict(amp) {
_sum[idx] = _outputs[idx] * _weigths[idx];

});

for (int i = 0; i < e[0]; i += 1) {
sum += _sum[i];
}

output=Neuron::transferFunction(sum);
return output;

};

现在程序运行代码非常慢。不仅慢了几毫秒,而且实际慢了几秒。

我还尝试在 AMP 代码中求和(仅更改):

array_view<float> _sum(1);
_sum.discard_data();

...

parallel_for_each(e, [=](index<1> idx) restrict(amp) {
_sum[0] += _outputs[idx] * _weigths[idx];

});

...

/*for (int i = 0; i < e[0]; i += 1) {
sum += _sum[i];
}
*/

output=Neuron::transferFunction(_sum[0]);

但最终,代码就是这样:太慢了,我用手算器会更快。现在的问题是:为什么?我想,如果我有一个 2000 权重的神经元,让 GPU 计算一切就太好了。我是否遗漏了什么,或者我必须学习 OpenCL 或 CUDA?

附言。缓慢真的很糟糕。就像它需要超过 100 000 倍的时间(同时我可以计算 20 000 个神经网络十次,我可以计算 2 个完全相同的网络一次使用 AMP)。

最佳答案

您使用 sum[0] 的代码几乎肯定会给出不正确的结果,因为许多线程同时更新 sum[0]

简单的实现应该可行,但效率非常低,因为将数据移入和移出 GPU 会产生大量复制开销,而且您只进行了很少的计算。

但是,它像您说的那样慢,这很可能是您在 CPU 上的 WARP 加速器上运行。您可以使用以下代码查看可用的加速器。

https://ampbook.codeplex.com/SourceControl/latest#Samples/ShowAmpDevices/ShowAmpDevices.cpp

你在这里做的是减少。有很多文章介绍如何在 GPU 上高效地执行此操作。您可以在此处找到显示几种不同实现的 C++AMP 代码:

C++ AMP: Accelerated Massive Parallelism with Microsoft Visual C++在 CodePlex 上。

它们在代码随附的书中有完整的解释。

关于C++ AMP 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555697/

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