【发布时间】:2015-11-18 13:13:30
【问题描述】:
我试图让神经网络在金属上运行。 基本思想是数据复制。每个 gpu 线程为随机数据点运行一个网络版本。
我编写了其他可以正常工作的着色器。
我还在 C++ 命令行应用程序中尝试了我的代码。那里没有错误。 也没有编译错误。
我使用苹果文档转换为金属 c++,因为并非所有来自 c++11 的内容都受支持。
它在加载内核函数并尝试将newComputePipelineStateWithFunction 分配给金属设备时崩溃。这意味着在编译时未捕获的代码存在问题。
MCVE:
kernel void net(const device float *inputsVector [[ buffer(0) ]], // layout of net *
uint id [[ thread_position_in_grid ]]) {
uint floatSize = sizeof(tempFloat);
uint inputsVectorSize = sizeof(inputsVector) / floatSize;
float newArray[inputsVectorSize];
float test = inputsVector[id];
newArray[id] = test;
}
更新
它与动态数组有关。
由于它无法创建管道状态并且在运行实际着色器时不会崩溃,这一定是编码问题。不是输入问题。
将动态数组中的值分配给缓冲区会导致失败。
【问题讨论】:
-
您问题中的文字数量令人恐惧。我确实阅读了所有内容,但仍然无法回答非常基本的问题:代码的最小可重现示例在哪里,以及您对“不工作”的理解是什么。
-
您应该将所有内容替换为重现错误的最少代码,并准确描述错误是什么。
-
你熟悉金属吗?然后您知道目前无法查明导致错误的代码行,或获取详细状态并找到破坏程序的值。无论如何,我在解决这个问题一天后问了这个问题。我不断添加我尝试并发现的内容。对文字数量感到抱歉,但由于这是全新的领域,最好添加更多信息。
-
标题中清楚地说明了确切的错误。在示例中可以找到攻击性代码。添加了完整但大大简化的着色器,以便其他人可以快速尝试并重现我的崩溃。代码中添加了注释以显示我在哪里找到了导致崩溃的部分。
-
从您的个人资料中,我猜您不会为 mac 编写代码。所以你不知道金属会带来什么痛苦。如果我们能保持主题而不是形式,我将不胜感激。当苹果公司能够理解某条管道失败的原因时,将会有很多很好的问题。在那之前,它会很混乱,令人沮丧,而且没有很多答案。也许我很幸运,有人已经遇到过类似的问题。