OpenCL 内核未矢量化

2024-01-07

我正在尝试构建一个内核来进行并行字符串搜索。为此,我倾向于使用有限状态机。 fsm 的转换表位于内核参数状态中。代码:

 __kernel void Find ( __constant char *text,
        const      int offset,
        const      int tlenght,
        __constant char *characters,
        const int clength,
        const int maxlength,
        __constant int *states,
        const int statesdim){

    private char c;
    private int state;
    private const int id = get_global_id(0);

    if (id<(tlenght-maxlength)) {

        private int cIndex,sd,s,k;

        for (int i=0; i<maxlength; i++) {

            c = text[i+offset];

            cIndex = -1;

            for (int j=0; j<clength; j++) {

                if (characters[j]==c) {
                    cIndex = j;
                }       
            }    

            if (cIndex==-1) {

                state = 0;
                break;

            }  else {

                s = states[state+cIndex*statesdim];

            }

            if (state<=0) break;

        }    
    }
}   

如果我使用 iocgui 编译这个内核,我会得到结果:

Using default instruction set architecture.
Intel OpenCL CPU device was found!
Device name: Pentium(R) Dual-Core CPU       T4400  @ 2.20GHz
Device version: OpenCL 1.1 (Build 31360.31426)
Device vendor: Intel(R) Corporation
Device profile: FULL_PROFILE
Build started
Kernel <Find> was successfully vectorized
Done.
Build succeeded!

当我更改确定新状态的行时:

state = states[state+cIndex*statesdim];

结果是:

Using default instruction set architecture.
Intel OpenCL CPU device was found!
Device name: Pentium(R) Dual-Core CPU       T4400  @ 2.20GHz
Device version: OpenCL 1.1 (Build 31360.31426)
Device vendor: Intel(R) Corporation
Device profile: FULL_PROFILE
Build started
Kernel <Find> was not vectorized
Done.
Build succeeded!

该声明

X = states[state+cIndex*statesdim];

无法矢量化,因为索引不一定评估为跨线程访问后续字节。

请注意,在您的第一个内核中,您有目标变量s它尚未写回全局内存。因此,编译器可能会优化代码并删除s = states[state+cIndex*statesdim];陈述。因此,看起来您的语句已被矢量化,但事实并非如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCL 内核未矢量化 的相关文章

  • MATLAB 版本 7 中的 pdist2 等效项

    我需要在matlab中计算两个矩阵之间的欧几里德距离 目前我正在使用 bsxfun 并计算距离 如下所示 我附上代码片段 for i 1 4754 test data fea test i d sqrt sum bsxfun minus t
  • 多个常数到一个矩阵并将它们转换为matlab中的块对角矩阵

    我有a1 a2 a3 它们是常数 我有一个矩阵A 我想做的是得到a1 A a2 A a3 A三个矩阵 然后我想将它们转移到对角块矩阵中 对于三个常数的情况 这很容易 我可以让b1 a1 A b2 a2 A b3 a3 A 然后在matlab
  • 用于分类的 Python 向量化[重复]

    这个问题在这里已经有答案了 我目前正在尝试构建一个包含大约 80 个类别的文本分类模型 文档分类 当我使用随机森林构建和训练模型时 将文本矢量化为 TF IDF 矩阵后 该模型运行良好 然而 当我引入新数据时 我用来构建 RF 的相同单词不
  • 更有效的循环方式?

    我有来自一个更大脚本的一小段代码 我发现当函数t area被调用时 它负责大部分运行时间 我自己测试了这个函数 它并不慢 我相信它需要运行很多次 所以需要花费很多时间 这是调用该函数的代码 tri area np zeros numx nu
  • 使用 OpenCL 或其他 GPGPU 框架在现代 x86 硬件上的 CPU 和 GPU 之间共享数据

    AMD Kaveri 的 hUMA 异构统一内存访问 和 Intel 第四代 CPU 证明了 CPU 和 GPU 硬件的不断统一 应该允许 CPU 和 GPU 之间进行无副本的数据共享 我想知道 最新的 OpenCL 或其他 GPGPU 框
  • 如何矢量化 3D Numpy 数组

    我有一个 3D numpy 数组 例如a np zeros 100 100 20 我想对每个执行操作x y涉及所有元素的位置z轴 结果存储在一个数组中 例如b np zeros 100 100 在同一个对应的x y位置 现在我使用 for
  • 在 OpenCL 内核中使用 _ 常量限定符

    我在使用时遇到问题 持续的我的 OpenCL 内核中的限定符 我的平台是雪豹 我尝试在 GPU 上初始化 CL 只读内存对象 将常量数组从主机复制到其中 然后我设置内核参数就像 global内存参数 但这不起作用 但我没有看到任何错误或警告
  • 在python中向量化6个for循环累积和

    数学问题是 总和中的表达式实际上比上面的表达式复杂得多 但这是一个最小的工作示例 以免事情过于复杂 我使用 6 个嵌套 for 循环在 Python 中编写了此代码 正如预期的那样 即使在 Numba Cython 和朋友的帮助下 它的性能
  • 在 Mac OS X 10.7.4 上使用 OpenCL 禁用 Nvidia 看门狗

    我有一个 OpenCL 程序 对于小问题运行良好 但是当运行较大的问题超过 Nvidia 硬件上运行内核的 8 10 秒时间限制时 虽然我没有将显示器连接到我正在计算的 GPU Nvidia GTX580 上 但一旦内核运行大约 8 10
  • 将 2D 数组中的每一列与另一个 2D 数组中的每一列相乘

    我有两个 Numpy 数组x有形状 m i and y有形状 m j 所以行数是相同的 我想将每一列相乘x每一列y逐元素 使结果具有形状 m i j Example import numpy as np np random seed 1 x
  • 在matlab中不使用for循环检查数组中的成员资格

    我想简化这段代码 使其无需 for 循环即可工作 for i 1 N for j 1 N if ismember j A PID i i TFP i j PID i i end end end 其中A是一个包含一些标签的矩阵 我之前存储的T
  • OpenCL 内核在 Nvidia GPU 上每个线程使用多少寄存器?

    我的第一个问题是如何获取 Nvidia GPU 上 OpenCL 内核代码的寄存器使用信息 因为 nvcc 编译器给出了相同的使用信息nvcc ptxas options vCUDA 内核代码的标志 我还从 AMD GPU for Open
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • 为什么编译器在这里错过矢量化?

    考虑以下valarray类 include
  • Numpy:生成二维高斯 pdf 总和作为数组

    我正在尝试生成一个 600 x 600 numpy 数组 其中包含 10 个类似高斯数组的总和 每个数组都有一个随机生成的中心 我尝试使用高斯滤波器来生成各个类似高斯的数组 然后将它们相加 但我确信有一种矢量化的方法可以解决这个问题 即使n
  • 是否可以保证 WaveFront (OpenCL) 中的所有线程始终同步?

    众所周知 有WARP 在CUDA中 和WaveFront 在OpenCL中 http courses cs washington edu courses cse471 13sp lectures GPUsStudents pdf http
  • 如何将位对从 uint64_t 解压缩到 __m256i?

    考虑uint64 t其中每连续 2 位都是一个数字 b00 for 0 b01 for 1 b11 for 1 and b10未使用 永远不会发生 假设没有对其进行处理 如何解压这样的uint64 t into m256i以便原始数字中的位
  • numpy 中二维数组的矢量化移动窗口

    我对二维数组中大小恒定的移动窗口应用操作 是否有一种高效的类似矢量化的操作可以实现 而无需在 Python 中循环 我当前的结构看起来像这样 for i in range 1 xmax 1 for j in range 1 ymax 1 o
  • 如何使用 itertools 模块构建“矢量化”构建块?

    The 食谱部分 http docs python org library itertools html recipes of itertools文档以此文本开头 扩展工具提供与基础工具相同的高性能 工具集 通过处理保持卓越的内存性能 一次
  • HUGE_VALF 和 INFINITY 常量之间的区别

    在 OpenCL 中 有两个代表无穷大的浮点数学常数 其中之一很简单INFINITY 另一个 HUGE VALF 求值为 无穷大 这两者有什么区别 求值至 无穷大是什么意思 HUGE VALF是一个旧名称 允许不支持无穷大的浮点系统 例如

随机推荐

  • 红宝石大虾如何在对齐的右图像周围环绕文字?

    是否可以使用 float right 属性将图像向右对齐并将文本环绕在图像周围 就像在 html 和 css 中一样 如果是这样 你该怎么做 我可以对齐图像 但不知道如何将文本环绕在图像周围 文本是动态文本 因此长度变化很大 多谢 瑞克 一
  • Carrierwave 雾 Amazon S3 图像不显示

    我已经安装了CarrierWave和Fog 已经成功上传图像并第一次查看它们 但现在它不再显示图像了 这是我的配置文件应用程序 配置 初始化器 Carrierwave rb CarrierWave configure do config c
  • Presto SQL - 如何获得数组的所有可能组合?

    我想要给定数组中的所有可能的数字组合 我尝试使用 presto 的一些预定义函数 例如 array agg x Input 1 2 3 4 Output when n 2 1 2 1 3 1 4 2 3 2 4 3 4 when n 3 1
  • SQL 计数器和返回器,将结果加倍

    我正在尝试制作一个列表 显示我的论坛上的所有类别 显示类别名称 ID 以及计数 计算有多少线程附加到该类别 它工作得很好 但是 它打印了两次结果 这是 SQL SELECT categories category name threads
  • 如何构建具有正常、斜体和粗体字体的轴标签

    我想构造以下 x 轴标签 bla bla bli bli bla blom bla 正常 正常斜体 斜体 正常粗体斜体 是否可以 多谢 编辑 是否也可以更改字体 plot 1 1 xlab expression bla bla italic
  • NATS 与分子。如何更改 NATS max_payload 值?

    我的问题是我需要增加 NATS 收到的 max payload 值 但我不知道在哪里可以做到这一点 该项目使用 Moleculer NATS 是通过 docker 创建为容器 当我尝试发出大于 1MB NATS 的请求时返回 ERROR N
  • Linq 仅查询每个唯一 ID 的前 N ​​行

    假设我有一个IQueryable这将返回一个数据类型ID属性 列 我想进一步过滤我的查询 我不想评估查询 如下 对于每一个独特的ID从主查询中 我想Take n where n是某个任意数 也就是说 我只想保留第一个n每个唯一 ID 的行
  • 如何在 IntelliJ IDEA 中使用“自定义 jar”?

    我正在尝试设置 IntelliJ IDEA 尝试了 12 和 13 Mac 以使用包含 Java 应用程序的 jar 文件的 Java 类 我已通过以下过程将 jar 设置为模块依赖项 从 项目窗口 开始 选择我的主Java模块 使用菜单文
  • Swift 异步 let 带循环

    我想并行获取数据 我找到了一个并行调用 API 的示例 但我想存储async let variables与循环 异步让我们举个例子 但是 此示例未使用循环 async let firstPhoto downloadPhoto named p
  • 使用 lapply 编写 data.frames 列表以分隔 CSV 文件

    问题说明了一切 我想获取一个充满 data frames 的列表对象 并将每个 data frame 写入一个单独的 csv 文件 其中 csv 文件的名称对应于列表对象的名称 这是一个可重现的示例以及我迄今为止编写的代码 df lt da
  • 带有 php 服务器套接字的 TLS

    Hi我的问题是 我的服务器端代码 编写为 php 中有一个打开的套接字 我需要转换此套接字以使用 TLS 在将流传递给使用清晰流的现有代码之前对流进行协商和描述没有加密 归档这个最简单的解决方案是什么 PHP 支持使用流上下文的 TLS S
  • Amazon Cognito 删除帐户

    我有 Amazon Cognito 用户池 其中添加了很少的用户 我已添加触发器以在发布确认后调用我的 Lambda 函数 我们在 Cognito 中是否有任何触发器在 用户注销 和 删除用户 之后调用 Lambda 函数 我在 Cogni
  • 如何使用 Unity WebCamTexture 保存 png

    我想使用设备本机相机保存图片 目前我无法将图像保存到文件中 我有一个原始图像 其纹理是本机设备相机图像 我正在从原始图像中获取字节并编码为 png 然后我将 png 写入我的计算机上的文件中 public WebCamTexture web
  • C# azure storage download 中路径访问被拒绝

    从天蓝色存储下载文件时 我遇到访问路径被拒绝的异常 下面是代码片段 string path c TEMP Retrieve storage account from connection string CloudStorageAccount
  • UITableViewCell 带有操作的按钮

    您好 我有一个自定义 UITableViewCell 带有三个按钮来处理购物车功能 加号 减号和删除按钮 我需要知道哪个单元格已被触摸 我已经尝试使用 标签解决方案 但由于细胞的生命周期 它不起作用 谁能帮我找到解决方案吗 提前致谢 我使用
  • 为什么我收到错误“MyActivity 不是封闭类?”

    我有一个 libgdx 程序 它以以下类开头 public class MyActivity extends AndroidApplication implements IActivityRequestHandler 我需要有一个Activ
  • Vuex axios调用无法处理422响应

    我正在尝试处理来自 API 的 422 响应 以防在进行异步 Axios 调用时数据无效 在组件中 我有一个类似的方法 async saveChanges this isSaving true await this store dispat
  • javax.imageio.IIOException:无法从 URL 获取输入流!

    我用java代码编写了一段代码来保存指定链接中的图像 它大部分工作正常 但有时它会抛出异常 即 javax imageio IIOException 无法从 URL 获取输入流 在 javax imageio ImageIO read Im
  • MySQL Select 和 IF() 语句

    我对 MySQL 有点陌生 我需要帮助 我有一张桌子Invoices和一张桌子Payments 我无法生成显示所有已支付发票的报告In Full or a Partial Payment已于 2019 年 12 月 31 日收到 一张发票可
  • OpenCL 内核未矢量化

    我正在尝试构建一个内核来进行并行字符串搜索 为此 我倾向于使用有限状态机 fsm 的转换表位于内核参数状态中 代码 kernel void Find constant char text const int offset const int