设为首页 加入收藏

TOP

Metal并行计算以及Metal程序的命令行编译(二)
2018-07-13 06:07:16 】 浏览:277
Tags:Metal 并行 计算 以及 程序 命令 编译
readgroups(threadgroupsPerGrid, threadsPerThreadgroup: threadsPerThreadgroup)
//完成一个调用的所有设置
encoder.endEncoding()


var start, end : UInt64
var result : DataType = 0


start = mach_absolute_time()
//真正提交任务
cmds!.commit()
//等待完成GPU计算
cmds!.waitUntilCompleted()
//GPU计算式分批次汇总的,数量已经很少了,最后用CPU进行完整的汇总
for elem in results {
    result += elem
}
end = mach_absolute_time()
//显示GPU计算结果及所用时间
print("Metal result: \(result), time: \(Double(end - start) / Double(NSEC_PER_SEC))")
result = 0


//下面是使用CPU完整的计算一次,并显示结果、耗费时间
start = mach_absolute_time()
data.withUnsafeBufferPointer { buffer in
    for elem in buffer {
        result += elem
    }
}
end = mach_absolute_time()
print("CPU result: \(result), time: \(Double(end - start) / Double(NSEC_PER_SEC))")



shade程序命名为:shader.metal


//各项数据类型必须跟Swift中定义的相同
#include <metal_stdlib>
typedef unsigned int uint;
typedef int DataType;


kernel void parsum(const device DataType* data [[ buffer(0) ]],
                  const device uint& dataLength [[ buffer(1) ]],
                  device DataType* sums [[ buffer(2) ]],
                  const device uint& elementsPerSum [[ buffer(3) ]],


                  const uint tgPos [[ threadgroup_position_in_grid ]],
                  const uint tPerTg [[ threads_per_threadgroup ]],
                  const uint tPos [[ thread_position_in_threadgroup ]]) {
    //根据组索引、批次索引、组中位置计算总的索引值,这个是唯一的
    uint resultIndex = tgPos * tPerTg + tPos;
    //计算本批次数据的开始结束位置
    uint dataIndex = resultIndex * elementsPerSum; // Where the summation should begin
    uint endIndex = dataIndex + elementsPerSum < dataLength ? dataIndex + elementsPerSum : dataLength; // The index where summation should end
    //对本批次数据求和
    for (; dataIndex < endIndex; dataIndex++)
        sums[resultIndex] += data[dataIndex];
}


给一个在命令行使用的编译脚本:


#!/bin/bash
xcrun metal -o shader.air shader.metal
xcrun metal-ar rcs shader.metal-ar shader.air
xcrun metallib -o default.metallib shader.metal-ar
swiftc testCompute.swift? 


在我的笔记本上运行效果如下:


metal> ./testCompute
Metal result: 495056208, time: 0.017362745
CPU result: 495056208, time: 1.210801891


作为一个比较片面的比较,GPU计算速度,比CPU快121倍。
 测试环境:
MacBook Pro (13-inch, 2017, Four Thunderbolt 3 Ports)
 CPU:3.1 GHz Intel Core i5
 Graphics:Intel Iris Plus Graphics 650 1536 MB
 Memory:8 GB 2133 MHz LPDDR3
 Xcode:9.4.1


参考资料:
https://stackoverflow.com/questions/38164634/compute-sum-of-array-values-in-parallel-with-metal-swift


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇深入理解Linux用户态驱动设计 下一篇《连连看》算法C语言演示(自动连..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目