首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将一个浮点数组传递给金属内核函数?

如何将一个浮点数组传递给金属内核函数?
EN

Stack Overflow用户
提问于 2019-03-20 07:51:21
回答 1查看 898关注 0票数 1

我不想用texture1d_array。我能简单地传递一个浮点数组吗?我将在我的内核函数中写入它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-20 08:47:35

为了在内核函数中写入一个浮点数组,您需要向内核提供一个缓冲区参数。该参数应具有device float *类型,并使用buffer属性进行属性,以指定它将占用哪个参数表槽:

代码语言:javascript
复制
kernel void my_kernel(device float *data [[buffer(0)]],
                      uint threadIndex [[thread_position_in_grid]])
{
    data[threadIndex] = /* calculate value for this element */;
}

要在您的应用程序代码中创建这样的缓冲区,请请求它由您的Metal设备分配:

代码语言:javascript
复制
let buffer = device.makeBuffer(length: MemoryLayout<Float>.stride * dataCount,
                               options: [])!

在Mac上,您可能希望使用.storageModeManaged选项创建缓冲区,该选项不会自动将您从内核写回的值同步到CPU可读内存。您可以使用blit编码器和synchronize(resource:)方法从GPU内存中复制回来。在iOS上,托管缓冲区不存在,除了通常的情况外,不需要任何同步(确保您永远不会从其他人正在写入的相同位置进行读取)。

当您准备好分派计算工作时,将缓冲区绑定为计算命令编码器的参数:

代码语言:javascript
复制
computeCommandEncoder.setBuffer(buffer, offset: 0, index: 0)

调度任何大小的网格都可以完成任务。在命令缓冲区中对您可能需要执行的任何其他工作(包括同步命令)进行编码,提交命令缓冲区,并确保在尝试读取缓冲区的内容之前完成该操作。

要读取缓冲区的内容,请将缓冲区的内容强制转换为适当类型的UnsafeMutableBufferPointer,这样您就可以像对待任何其他Sequence一样对待缓冲区

代码语言:javascript
复制
let data = UnsafeMutableBufferPointer<Float>(start: buffer.contents().assumingMemoryBound(to: Float.self),
                                             count:dataCount)
// iterate over elements of data or whatever...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55251612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档