我想知道自从5年(5年前)出现以来Mono.SIMD(或Mono内部的SIMD支持)是否有任何开发.我个人认为这是提高c#速度的重要一步.但是,我已经使用了一段时间了,我觉得Mono.SIMD落后了,因为很多功能都缺失了.
我面临的一些问题包括:
那么,有没有人知道Mono.SIMD或SIMD支持是否正在发生某些事情(如果是这样的话)?或者,或者,有人知道提到的任何问题的良好解决方案吗?
最近,Apple 发布了一个直接使用 C++ 使用 Metal 的库。我在网上找到的示例(https://github.com/moritzhof/metal-cpp-examples)如果我复制源代码并按照Apple概述的步骤进行操作(https://developer.apple.com) ,则可以使用该示例/metal/cpp/)在 Xcode 中。我不使用附带的 Xcode 项目文件,以避免任何“隐藏”设置。
现在我尝试使用 CMake 构建相同的示例,其中包含以下 CMakeLists.txt:
cmake_minimum_required(VERSION 3.8)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 17)
include_directories(${PROJECT_SOURCE_DIR}/metal-cpp)
set(SOURCE_FILES metal-cpp-test/main.cpp metal-cpp-test/metal_adder.cpp)
add_executable(program ${SOURCE_FILES})
# specify which libraries to connect
# target_link_libraries(program ${METAL})
# target_link_libraries(program ${FOUNDATION})
# target_link_libraries(program ${QUARTZCORE})
find_library(METAL Metal)
find_library(FOUNDATION Foundation)
find_library(QUARTZCORE QuartzCore)
target_link_libraries(program stdc++ "-framework Metal" "-framework Foundation" "-framework QuartzCore" objc)
Run Code Online (Sandbox Code Playgroud)
它编译成功,但是行
auto lib = _device->newDefaultLibrary();
Run Code Online (Sandbox Code Playgroud)
现在似乎返回一个 null-ptr。知道这可能是什么原因以及如何解决这个问题吗?
我目前正在使用C#对应用程序进行编码,因为相对较小的代码会导致90-95%的执行时间.代码本身也非常适合SSE(因为它是矩阵和基于矢量的),所以我继续开始使用Mono.Simd,尽管这在执行时间上有显着差异,但这仍然不够.Mono.Simd的问题在于它只有非常旧的SSE指令(主要来自SSE1和SSE2,我相信),这导致dotproduct(或标量/内积)例如占用3条指令,而它可以是仅在一条指令中使用SSE4实现(并且自2006年以来SSE4可用,可以安全地假设现在每台现代计算机都有它).此外,根本不包括许多其他功能(例如,获取每个数字的绝对值,这也需要一个笨拙的解决方法).
我的问题是,我可以在我的C#代码中调用任何其他库来使用SSE/SIMD吗?也可以在C#中使用内联汇编,所以显然我也可以使用C++代码,即使这会导致性能损失很小,但如果有人会有一个相对易于使用的C++库,那么这是可以接受的我猜.
在此先感谢您的帮助.