从内存加载向量的更好方法。 (铛)

2023-11-23

我正在编写一个测试程序,以适应 OpenCL 样式向量的 Clang 语言扩展。我可以让代码正常工作,但我在获取其某一方面时遇到了问题。我似乎无法弄清楚如何让 clang 很好地从标量数组加载向量。

目前我必须做类似的事情:

byte16 va = (byte16){ argv[1][start], argv[1][start + 1], argv[1][start + 2], 
                      argv[1][start + 3], argv[1][start + 4], argv[1][start + 5], 
                      argv[1][start + 6], argv[1][start + 7], argv[1][start + 8],
                      argv[1][start + 9], argv[1][start + 10], argv[1][start + 11],
                      argv[1][start + 12], argv[1][start + 13], argv[1][start + 14],
                      argv[1][start + 15]};

我理想地想要这样的东西:

byte16 va = *(byte16 *)(&(argv[1][start]));

我可以使用 ARM 或 x86 的正确内在函数轻松完成此操作。但是该代码虽然可以编译,但会导致程序崩溃。


x86 上可能发生崩溃的原因之一是对齐问题。我的系统上没有 clang 来重现该问题,但我可以在 GCC 的示例中演示它。

如果你做类似的事情:

/* Define a vector type of 16 characters.  */
typedef char __attribute__ ((vector_size (16))) byte16;

/* Global pointer.  */
char *  foo;

byte16 test ()
{
  return *(byte16 *)&foo[1];
}

现在,如果您使用以下命令在支持向量的 x86 上编译它:

$  gcc -O3 -march=native -mtune=native   a.c

您将获得以下组件用于测试:

test:
    movq foo(%rip), %rax
    vmovdqa 1(%rax), %xmm0
    ret

请注意,移动是对齐的,这当然是错误的。现在,如果您将此函数内联到主函数中,您将得到如下所示的内容:

int main ()
{
  foo = __builtin_malloc (22);
  byte16 x = *(byte16 *)&foo[1];
  return x[0];
}

你会没事的,你会得到不一致的指导。这是一种错误,在编译器中没有很好的修复,因为它需要通过添加新的数据结构等进行过程间优化。

问题的根源在于编译器假设向量类型是对齐的,因此当您取消引用对齐向量类型的数组时,可以使用对齐移动。作为 GCC 中该问题的解决方法,我们可以定义一种未对齐的向量类型,例如:

typedef char __attribute__ ((vector_size (16),aligned (1))) unaligned_byte16;

并用它来取消引用未对齐的内存。

我不确定您在设置中是否遇到了这个问题,但我建议通过检查编译器的程序集输出来检查这一问题。

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

从内存加载向量的更好方法。 (铛) 的相关文章

  • WP8.1 C# 绑定联系人图像

    信息很简单 我正在尝试创建一个可以显示用户联系人的应用程序 我也是一名自学成才的程序员 所以我在某些方面有编程经验 但总体来说我对数据绑定相对较新 首先 我有一个 ListView 控件 其中包含图像绑定
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • 使用 JSON 格式正确配置 NLog 到 IHostBuilder

    我有以下代码 应该接受 NLog 的 JSON appsettings 配置 然后使用它来创建 NLog LogFactory 这个 NLog 工厂应该被传递到 MyService 类中 以便在那里创建一个记录器 class Program
  • 有没有办法将 boost::json::serializer 切换为美化输出?

    Using boost json serializer如中的示例所示文档 快速查看 http vinniefalco github io doc json json usage quick look html以紧凑格式保存 json tre
  • 使用 size_t 值反向遍历向量

    我想以相反的方向遍历向量的值 如您所知 向量的大小为 size t 当我使用以下代码时 for size t r m size 1 r gt 0 r x r f r for size t c r 1 c lt m size c x r m
  • 本地主机上的 .net HTTP_X_FORWARDED_FOR NULL

    抱歉 如果其他地方已经回答了这个问题 我找不到它 如果没有 我会尝试查找访问过该站点的机器的原始 IP 根据我的基本理解 变量HTTP X FORWARDED FOR无论代理和其他过滤器如何 都会显示用户的 IP 如果这是真的 我正在尝试对
  • 如何填充两个样条线或直线系列之间的区域

    我有这个Chart 如何填充两个之间的区域Series S0 and S1 说蓝色和黄色Series 为此 我们编写了其中之一Paint事件 这里的ValueToPixelPosition https msdn microsoft com
  • Visual Studio Code 调试默认 ASP.NET Core MVC WebApp:不起作用

    我正在使用 Manjaro linux 并尝试调试默认的 ASP NET Core MVC 项目 但调试停止 没有任何错误 我创建了该项目 dotnet new mvc in a Meow文件夹 没什么特别的 然后添加了新的配置 NET C
  • printf() 使用字符串表“解码器环”调试库

    我写这封信是想看看你们中是否有人见过或听说过我即将描述的想法的实现 我有兴趣为嵌入式目标开发 printf 风格的调试库 目标非常遥远 并且我和目标之间的通信带宽预算非常紧张 因此我希望能够以非常有效的格式获取调试消息 通常 调试语句如下所
  • SQL参数化查询不显示结果

    我的 DataAcess 类中有以下函数 但它没有显示任何结果 我的代码如下 public List
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • 从 exit() 和 fork() 返回的结果奇怪地发生了位移

    我有一个 C 代码 有时会自行分叉 每个分叉都会执行一些操作 然后返回一个错误代码 目前 每个子进程返回其 ID 0 n void other int numero exit numero int main for int i 0 i lt
  • 参数数量在编译时确定的 Lambda 函数

    我想声明一个带有 N 个参数的 lambda 函数 其中 N 是模板参数 就像是 template
  • 如何使用 xamarin 表单提示用户进行地理定位

    我正在 Xamarin Forms 应用程序中开发一个应用程序 需要请求地理位置权限 如果获得许可 它需要从设备获取地理位置数据 然后将地理位置坐标放入 Forecast io URL 我正在使用 James 的 Geolocator 插件
  • 修改代码以从 Windows 中的 PE 可执行文件检索双重签名信息?

    我已经挣扎了一段时间想要修改这段代码示例 https support microsoft com en us help 323809 how to get information from authenticode signed execu
  • 未找到 _sqlite3_open 等符号错误

    您好 我收到此错误 Undefined symbols sqlite3 open referenced from main in ccRlWVer o sqliite3 close referenced from main in ccRlW
  • 为什么调试器只显示数组指针中的一个元素?

    首先 我知道new是执行此操作的 C 方法 我只是表明有不止一种方法可以重现此错误 而且两种方法都令人难以置信的令人沮丧 我有两种形式的源文件 我正在尝试调试另一个编程作业 但我并没有寻求帮助 基本上 我正在尝试重新实施set作为一个类 具
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 在 C# WinForms 中预览文档(Word、Excel、PDF、文本文件等)?

    我正在开发一个 C WinForms 应用程序 我希望能够 预览 其中的各种文档类型 也就是说 当用户从列表中选择文件名时 它会在下面以相同的形式显示所选文件的预览 这很像 Outlook 允许您无需双击即可预览选定邮件的方式 有没有什么方
  • 类模板的 C++ 静态成员 - 链接器警告“多重定义”[重复]

    这个问题在这里已经有答案了 假设出于某种原因 我想要一个类模板 MyTemp 和一些静态数据成员 smDummyVar Mytemp h ifndef MY TEMP H define MY TEMP H template

随机推荐

  • 向 DataTable 添加多行

    我知道有两种方法将带有数据的新行添加到DataTable string arr2 one two three dtDeptDtl Columns Add Dept Cd for int a 0 a lt arr2 Length a Data
  • 关于 C 中的 ## 预处理器

    Given define cat x y x y 电话cat a 1 回报a1 but cat cat 1 2 3 未定义 但是如果我也定义 define xcat x y cat x y 那么结果是xcat xcat 1 2 3 就是现在
  • RequireJS:根据环境加载不同的文件

    是否有根据当前项目环境 例如开发或生产 加载不同文件的功能 我的意思是 它可以帮助我透明地加载缩小或完整的文件 我读到有关多版本加载的内容 但多版本意味着我需要指定文件的版本 例如 我的模块中有 module js 文件 在这个文件中我需要
  • CSS 媒体查询 - 顺序很重要吗?

    现在我经常使用 CSS 媒体查询 我想知道最好按什么顺序使用它们 Method 1 media only screen and min width 800px content sidebar media only screen and ma
  • 获取文件的 QuickLook 预览图像

    有什么方法可以快速查看文件的预览图像吗 我正在寻找这样的东西 NSImage image QuickLookPreviewer quickLookPreviewForFile path See QLThumbnailRequest在文档中
  • Flutter 中的水平步进器

    我想创建一个水平步进器 我知道这很容易 但是这一次 步数应该很大 举个例子 这就是我在垂直领域所做的事情 import package flutter material dart void main gt runApp new MyApp
  • 在 C++ 中如何实现多个 COM 接口?

    我试图理解这个示例代码关于浏览器帮助程序对象 在内部 作者实现了一个公开多个接口 IObjectWithSite IDispatch 的类 他的 QueryInterface 函数执行以下操作 if riid IID IUnknown pp
  • 如何验证 jar 内 MANIFEST.MF 的顺序?

    我遇到了一个有趣的问题 这对我来说绝对是新的 正如我突然发现的 Jar 规范说 被包含在内 META INF and MANIFEST MF必须是第一个和第二个条目 jar包而不仅仅是存档中的目录和文件 我正在使用 Java 框架 非常注意
  • 如何在 C++/CLI 中使用 boost::bind 绑定托管类的成员

    我在本机 C 类中使用 boost signal 现在我正在 C CLI 中编写 NET 包装器 以便可以将本机 C 回调公开为 NET 事件 当我尝试使用 boost bind 获取托管类的成员函数的地址时 出现编译器错误 3374 指出
  • Python CSV 到 SQLite

    我正在 转换 一个大的 1 6GB CSV 文件并将CSV 的特定字段插入到SQLite 数据库中 基本上我的代码如下所示 import csv sqlite3 conn sqlite3 connect path to file db co
  • 使用 Apache POI 将部分单元格内容设置为下划线?

    我正在开发一个程序 其中我必须在 Excel 电子表格中设置单元格值 例如 这是一下划线 text 它可以是任何粗体 斜体或下划线 我正在使用 Apache POI 3 9 请尝试以下操作 public static void differ
  • 使用 Apache Beam 进行窗口化 - 修复了窗口似乎没有关闭的问题?

    我们正在尝试在 Apache Beam 管道上使用固定窗口 使用DirectRunner 我们的流程如下 从发布 订阅中提取数据 将 JSON 反序列化为 Java 对象 带有 5 秒固定窗口的窗口事件 使用自定义CombineFn 合并每
  • 将单词列表中的所有单词替换为 python 中的另一个字符串

    我有一个用户输入了字符串 我想搜索它并用我的替换字符串替换单词列表中出现的任何内容 import re prohibitedWords MVGame Kappa DatSheffy DansGame BrainSlug SwiftRage
  • 如何将 && 操作数解析为逻辑标量

    当我在matlab中运行代码后 我遇到了这个错误 并且不确定如何解决它 我怎么解决这个问题 Warning 的操作数和 运算符必须可转换为逻辑标量值 Jgray double rgb2gray J Calculate the Gradien
  • 使用 XML 和 XSD 创建填充数据库

    我不确定这是否可行 但我想我会询问并看看是否可以获得任何信息 正如标题所示 我有一个包含数千行的 XML 文件 我还有其关联的 XSD 架构文件 我想知道 我是否可以在不手动指定 XPath 的情况下将这些数据转换为 MySQL 数据库 例
  • Android模拟器设置没有相机选项(用于虚拟场景)

    I want my android emulator to be in a virtual scene when I open the camera but it doesn t work It just shows a pixelated
  • 使用模型绑定从 MVC 4 中的 List 中选择项目

    给定一个类 public class Person Some general properties public List
  • 在 YAML 中重复节点值

    pagination limit default 10 min 0 max 50 current default The current节点的值应与default节点 在本例中为 10 可以用 YAML 做到这一点吗 您可以使用anchor
  • 与“make install”相反的是什么,即如何在 Linux 中卸载库?

    在跑步的时候 configure prefix mingw 在我之前运行的一个库的 MinGW MSYS 系统上 configure prefix mingw make make install 我看到了这条消息 警告 已安装 Vamp 插
  • 从内存加载向量的更好方法。 (铛)

    我正在编写一个测试程序 以适应 OpenCL 样式向量的 Clang 语言扩展 我可以让代码正常工作 但我在获取其某一方面时遇到了问题 我似乎无法弄清楚如何让 clang 很好地从标量数组加载向量 目前我必须做类似的事情 byte16 va