我是一名 GPGPU 开发人员,我使用 CUDA 完成了所有工作。最近,我为我的家庭设置购买了 AMD GPU,并且我一直在阅读有关 SYCL 和 oneAPI 的文章,但我不确定我是否理解它们是什么,它们是如何互补的。如果我理解正确的话,SYCL 是 Khronos 开发的一个标准,它允许在 C++ 中创建并行软件。它需要一个由 SYCL 实现提供的自定义工具链,并且存在多个实现。
另一方面,oneAPI 是 SYCL 的一个实现,带有一些额外的扩展(将来可能会添加到 SYCL 标准中)和一些带有典型并行库的库,对吗?
因为我有一个AMD GPU,我想用它来做一些GPGPU,但生态系统有点吓人。我们有台面驱动程序、AMD 驱动程序、不同的 openCL 实现、HIP ……这一切是如何组合在一起的?
GPU 编程的最佳方法是什么?
我知道:
OpenCL 是我更喜欢的方式,我希望在硬件支持方面非常灵活。但如果不再得到 NVidia 的支持,那就是淘汰赛了。对于我来说,HIP 对于不同的发布文件来说是最好的。但英特尔即将推出的硬件的支持情况如何呢?
还有其他选择吗?对我来说重要的是许多受支持的硬件,长期支持,以便在几年内也可以编译并独立制造。附加:应该能够使用obe以上的编译器,在Linux和Windows上都支持。
我正在尝试使用 Haskell 图像处理包HIP向图像添加过滤器,我能够使用ByteString包读取图像并使用 HIP 将图像转换为类型Image VS YCbCr Word8。现在,我如何从 转换Image VS YCbCr Word8为Border (Pixel cs e)or Pixel cs e?我仍在学习 Haskell 所以请保持简单。请参阅下面的代码:
addFilterJpg :: FilePath -> IO ()
addFilterJpg fc = do
case validPath fc of
Left err -> putStrLn err
Right img -> do
case readImage img of
Left err -> putStrLn err
Right img -> do
-- convert img::(Image VS YCbCr Word8) to Border (Pixel cs e)
-- apply …Run Code Online (Sandbox Code Playgroud) HIP是与NVIDIA的CUDA对应的AMD GPU编程模型。我有一个来自 HIP 源代码的代码片段,我无法完全理解。提醒一下,理解以下代码snippnet不需要任何HIP背景知识,但更多的是C++模板/函数指针的问题。
typedef int hipLaunchParm;
template <typename... Args, typename F = void (*)(hipLaunchParm, Args...)>
inline void hipLaunchKernel(F&& kernel, const dim3& numBlocks, const dim3& dimBlocks,
std::uint32_t groupMemBytes, hipStream_t stream, Args... args)
{
hipLaunchKernelGGL(kernel, numBlocks, dimBlocks, groupMemBytes, stream,
hipLaunchParm{}, std::move(args)...);
}
Run Code Online (Sandbox Code Playgroud)
我对以下内容感到困惑:
typename... Args有什么用?class ImageFormat format => Readable img format where
decode :: format -> B.ByteString -> Either String img
Run Code Online (Sandbox Code Playgroud)
我不明白第一个参数应该是什么?例子会有所帮助。