C 中克罗内克乘积的高效计算

2023-11-22

我对 C 相当陌生,对于我的大部分研究来说,不需要比 python 更快的东西。然而,事实证明我最近所做的工作需要计算相当大的向量/矩阵,因此 C+MPI 解决方案可能是合适的。

从数学上来说,任务非常简单。我有很多维数约为 40k 的向量并希望计算克罗内克产品选定的这些向量对,然后对这些克罗内克乘积求和。

问题是,如何有效地做到这一点?下面的代码结构,使用for循环,或者得到的效果有什么问题吗?

功能kron下面描述的传递向量A and B长度vector_size,并计算其克罗内克积,并将其存储在C, a vector_size*vector_size matrix.

void kron(int *A, int *B, int *C, int vector_size) {

    int i,j;

    for(i = 0; i < vector_size; i++) {
        for (j = 0; j < vector_size; j++) {
            C[i*vector_size+j] = A[i] * B[j];
        }
    }
    return;
}

这对我来说似乎很好,并且当然(如果我没有犯一些愚蠢的语法错误)会产生正确的结果,但我偷偷怀疑嵌入的 for 循环不是最佳的。如果我应该采取其他方法来解决这个问题,请告诉我。欢迎提出建议。

我感谢您的耐心以及您可能提出的任何建议。再说一次,我对 C 非常缺乏经验,但是谷歌搜索并没有给我带来这个查询的乐趣。


由于您的循环体都是完全独立的,因此肯定有一种方法可以加速这一过程。最简单的方法是在考虑 MPI 之前就已经利用多个内核。 OpenMP 在这方面应该做得很好。

#pragma omp parallel for
for(int i = 0; i < vector_size; i++) {
    for (int j = 0; j < vector_size; j++) {
        C[i][j] = A[i] * B[j];
    }
}

如今许多编译器都支持这一点。

您还可以尝试将一些常见表达式拖出内部循环,但像 gcc、icc 或 clang 等不错的编译器应该可以很好地自行完成此操作:

#pragma omp parallel for
for(int i = 0; i < vector_size; ++i) {
    int const x = A[i];
    int * vec = &C[i][0];
    for (int j = 0; j < vector_size; ++j) {
        vec[j] = x * B[j];
    }
}

顺便说一句,索引int通常这不是正确的做法。size_t是正确的typedef对于与对象的索引和大小有关的所有内容。

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

C 中克罗内克乘积的高效计算 的相关文章

  • 无法使用 strptime() 获取秒数

    我收到 YYYY MM DDThh mm ss S Z hh mm 这种格式的日期时间 我正在尝试使用复制该值strptime如下所示 struct tm time 0 char pEnd strptime datetime Y m dT
  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 如何在反应中使用gapi

    我想使用gapi从google访问people api资源 我尝试了很多方法来完成这项工作 但我仍然无法得到任何响应 它没有错误 没有警告 这是我的代码 loadYoutubeApi const script document create
  • Firebase 存储视频流

    我正在开发一个具有视频流功能的应用程序 我正在使用 firebase 数据库和 firebase 存储 我试图找到一些有关 firebase 存储如何处理视频文件的文档 但找不到太多 文档中提到 Firebase 存储与其他谷歌应用服务配合
  • 获取Java中当前运行的所有线程的列表

    有什么方法可以获取当前 JVM 中所有正在运行的线程的列表 包括线程 not由我的班级开始 是否也可以获得Thread and Class列表中所有线程的对象 我希望能够通过代码来做到这一点 要获得可迭代集 Set
  • 通过ADB Android发送AT命令

    我的工作任务是调查是否可以通过 ADB shell 向 Android 设备发送 AT 命令 到目前为止 我已尝试回显 AT 命令 但它会将它们作为普通字符串传递 任何帮助请任何人 请尝试这个 echo e AT CFUN r n gt d
  • JSF 2.0 部分状态保存似乎不起作用

    我正在评估在高流量网站中使用 JSF 的可能性 有人告诉我 在 JSF 2 0 中 组件树不存储在会话中 并且一旦组件树被修改 只存储增量 这是我正在查看的页面
  • jQuery 追加 DOM

    jQuery append 的所有示例似乎都采用 html 字符串并将其附加到容器中 我的用例略有不同 我的服务器返回一个 XML 其中包含要显示的 HTML 文本 例如
  • 无加速结果的高斯消去法

    我正在开发一个 C 库 对于我自己来说 代码 https github com BattlestarSC matrixLibrary git 来处理矩阵函数 这主要是一项学习 实践活动 我的挑战之一是有效地获取矩阵的行列式 由于我目前的尝试
  • CodeIgniter 框架上有类似 MasterPages 的东西吗?

    我是 Code Igniter 的新手 我想知道是否有任何东西可以像 NET 上的 MasterPages 一样工作 我还想知道我应该在哪里保存我的公共文件 例如脚本 样式和图像 问候 并预先感谢您 主视图未内置到框架中 要获得类似的效果
  • SSL证书是否绑定到服务器IP地址?

    我们在两个不同的物理办公地点有两个不同的 LDAP 提供商 当我将笔记本电脑连接到一个位置并 从端口检索 在 Websphere 6 1 中 以导入 ldap 提供者的 SSL 证书时 我可以毫无问题地对相应的 ldap 进行身份验证 如果
  • 此 COUNT MySQL 语句中出现未知列错误?

    错误是 where 子句中的未知列 num SELECT COUNT AS num books bookid FROM bookgenre has books WHERE num gt 10 GROUP BY books bookid 我究
  • 如何从 Google Places API 获取国家/地区代码

    我正在尝试使用 HTML 5 GeoLocation 来获取经度和纬度 然后使用 Google Maps API获取国家 地区代码该经度 纬度 有没有更简单的方法从 google place api 获取国家 地区代码 我从这个链接找到了解
  • Ruby 中的正则表达式负向后查找似乎不起作用

    制作一个参数解析器 我想将一个字符串分割成一个数组 其中分隔符是 除非前面有 这意味着字符串 foo ba r arg 应该导致 foo ba r arg 我正在尝试使用这个正则表达式
  • 如何使用用户凭据在 Powershell 中运行 Start-Process?

    我有一个 Windows 服务 Jenkins 它运行一个需要以特定用户身份运行命令的脚本 我尝试这样做 但它不起作用 secpasswd ConvertTo SecureString myPassword AsPlainText Forc
  • Admob 广告未展示 - Android

    我的广告根本不显示 我认为我已正确遵循文档 但它们仍然不会显示 该程序基本上是一个网络视图 我希望广告显示在底部 这是我的布局文件
  • 即使在“keep class”标志之后,ProGuard 也会混淆类。影响 Android WebView 行为

    我正在使用 ProGuard 来混淆我的 Android 应用程序 我也在用WebView显示一个网页 HTML 演练页面 其中包含一个可关闭该按钮的按钮WebView Javascript中有一个函数可以回调closeWalkthroug
  • 在appdata文件夹中创建sql server压缩文件

    我正在开发一个简单的软件 它首先使用实体 框架代码和sql server Compact 4 目前此设置有效 如果 sql server 压缩文件尚不存在 实体框架将创建该文件 数据库的路径是从存储在 app config 文件内的连接字符
  • Google OAuth 登录卡在加载同意屏幕上

    我的应用程序使用 Google Drive API 来备份用户文件 我想从头开始测试我的应用程序登录 因此我从我的 Google 帐户设置中手动撤销了该应用程序 但当我再次登录时 我在选择我的 Google 帐户后卡住了加载同意屏幕 见下文
  • 算法:将列表从一种顺序重新排列为另一种顺序的最佳方法?

    EDIT 我不确定我原来的问题是否足够清楚 我需要一种算法来计算将数组从一个顺序重新排列为另一个顺序的最小移动序列 众所周知 两个数组将包含相同的元素 没有重复 并且具有相同的长度 例如 reorder d a c b e a b c d
  • AWS Elasticbeanstalk 使用 .platform 覆盖 Nginx 配置不起作用

    我正在将 Laravel 应用程序部署到 AWS ElasticBeanstalk 我已经部署了 现在 我尝试使用 platform 文件夹覆盖 etc nginx conf d elasticbeanstalk php conf 文件 我
  • C 中克罗内克乘积的高效计算

    我对 C 相当陌生 对于我的大部分研究来说 不需要比 python 更快的东西 然而 事实证明我最近所做的工作需要计算相当大的向量 矩阵 因此 C MPI 解决方案可能是合适的 从数学上来说 任务非常简单 我有很多维数约为 40k 的向量并