CUDA 中的非方矩阵乘法

2023-12-14

我在 CUDA 中用于矩阵乘法的代码允许我乘以方阵和非方阵,但是,宽度和高度都必须是块大小的倍数。

因此,例如,我可以乘以 [3][6] * [6][3] (使用blocksize=3),但我不能乘以 [3][2]*[2][3]。

有谁知道如何做到这一点?这是我的内核:

#include <stdio.h>

#include <limits.h>

#include <stdlib.h>
#define blocksize 3
#define HM (1*blocksize) 
#define WM (2*blocksize) 
#define WN (1*blocksize)
#define HN WM 
#define WP WN   
#define HP HM  
#define PTH WM
#define PTW HM

__global__ void nonsquare(float*M, float*N, float*P, int uWM,int uWN)

{
__shared__ float MS[blocksize][blocksize];
__shared__ float NS[blocksize][blocksize];


int tx=threadIdx.x, ty=threadIdx.y, bx=blockIdx.x, by=blockIdx.y;
int rowM=ty+by*blocksize;
int colN=tx+bx*blocksize;
float Pvalue=0;


for(int m=0; m< uWM/blocksize;++m){
    MS[ty][tx]=M[rowM*uWM+(m*blocksize+tx)];
    NS[ty][tx]=M[colN + uWN*(m*blocksize+ty)];
    __syncthreads();

    for(int k=0;k<blocksize;k++)
        Pvalue+=MS[ty][k]*NS[k][tx];
    __syncthreads();
    P[rowM*WP+colN]=Pvalue;
     }
    }

提前致谢!


我认为最简单的方法就是用零填充末尾的块:

for(int m=0; m< uWM/blocksize;++m){
    colM = m*blocksize+tx;
    rowN = m*blocksize+ty;
    if (rowM > uWN || rowN > uWM || colM > uWM || colN > uWN) {
        MS[ty][tx]=0.;
        NS[ty][tx]=0.;
    } else {
        MS[ty][tx]=M[rowM*uWM+colM];
        NS[ty][tx]=N[colN + uWN*rowN];
    }

加或减。 (NS 行应该引用 N,而不是 M,对吗?)

但是,既然我似乎是这里唯一一个提倡尽可能使用现有的调整库的人——为什么不使用CUBLAS or MAGMA而不是自己滚动?它们速度很快,并且经过了数百名用户的测试。

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

CUDA 中的非方矩阵乘法 的相关文章

  • 如何在 Visual Studio 2010 中设置 CUDA 编译器标志?

    经过坚持不懈的得到error identifier atomicAdd is undefined 我找到了编译的解决方案 arch sm 20旗帜 但是如何在 VS 2010 中传递这个编译器标志呢 我已经尝试过如下Project gt P
  • 具有稀疏矩阵的 numpy 元素外积

    我想在 python 中对三个 或四个 大型二维数组进行逐元素外积 值是 float32 四舍五入到小数点后两位 它们都具有相同的行数 n 但具有不同的列数 i j k 所得数组的形状应为 n i j k 然后 我想对结果的每一列求和 最终
  • 设置最大 CUDA 资源

    我想知道是否可以设置 CUDA 应用程序的最大 GPU 资源 例如 如果我有一个 4GB GPU 但希望给定的应用程序只能访问 2GB 如果它尝试分配更多 就会失败 理想情况下 这可以在进程级别或 CUDA 上下文级别上设置 不 目前没有允
  • 有没有快速的矩阵求幂方法?

    Is there any faster method of matrix exponentiation to calculate Mn where M is a matrix and n is an integer than the sim
  • 在 __device/global__ CUDA 内核中动态分配内存

    根据CUDA 编程指南 http developer download nvidia com compute cuda 3 2 prod toolkit docs CUDA C Programming Guide pdf 第 122 页 可
  • 尝试构建我的 CUDA 程序时出现错误 MSB4062

    当我尝试构建我的第一个 GPU 程序时 出现以下错误 有什么建议可能会出什么问题吗 错误 1 错误 MSB4062 Nvda Build CudaTasks SanitizePaths 任务 无法从程序集 C Program 加载 文件 M
  • 有没有一种有效的方法来优化我的序列化代码?

    这个问题缺乏细节 因此 我决定创建另一个问题而不是编辑这个问题 新问题在这里 我可以并行化我的代码吗 还是不值得 https stackoverflow com questions 17937438 can i parallelize my
  • 内联 PTX 汇编代码强大吗?

    我看到一些代码示例 人们在 C 代码中使用内联 PTX 汇编代码 CUDA工具包中的文档提到PTX很强大 为什么会这样呢 如果我们在 C 代码中使用这样的代码 我们会得到什么好处 内联 PTX 使您可以访问未通过 CUDA 内在函数公开的指
  • 为什么列表理解在数组相乘方面比 numpy 快得多?

    最近我回答了THIS https stackoverflow com questions 31596979 multiplication between 2 lists 31597029 31597029想要两个列表相乘的问题 一些用户建议
  • “gld/st_throughput”和“dram_read/write_throughput”指标之间有什么区别?

    在 CUDA 可视化分析器版本 5 中 我知道 gld st requested throughput 是应用程序请求的内存吞吐量 然而 当我试图找到硬件的实际吞吐量时 我很困惑 因为有两对似乎合格的指标 它们是 gld st throug
  • 使用简单矩阵乘法时出错

    我在一次简单的乘法运算中偶然发现了一个错误 这让我感到非常惊讶 我一直以为这里发生了什么 只为矩阵乘法 http www mathworks nl help matlab matlab prog operators html x 2 y z
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • 大型跨平台软件项目的技巧/资源

    我将开始一个大型软件项目 涉及跨平台 GUI 和大量的数字运算 我计划用 C 和 CUDA 编写大部分应用程序后端 并用 Qt4 编写 GUI 我计划使用 Make 作为我的构建系统 这将是一个只有两名开发人员的项目 一旦我相对深入地了解它
  • 为什么 cuCtxCreate 返回旧上下文?

    我已经安装了 CUDA SDK 4 2 64 CUDA工具包4 2 64 CUDA 驱动程序 4 2 64 我检查了 windows 中的每个 nvcuda dll 所有这些都是 4 2 版本 但是当我使用驱动程序 api 创建上下文并使用
  • 更快地评估从右到左的矩阵乘法

    我注意到以二次形式评估矩阵运算右到左明显快于左到右在 R 中 取决于括号的放置方式 显然它们都执行相同的计算量 我想知道为什么会这样 这与内存分配有什么关系吗 A 5000 5000 B 5000 2 A matrix runif 5000
  • C 中的 CUDA:如何使用 cudaMemcpyAsync 修复错误 11

    我目前正在尝试使用 CUDA 运行一个简单的多 GPU 程序 它的基本作用是将一个包含一些虚拟数据的大型数组复制到 GPU GPU 进行一些数学计算 然后将结果数组复制回来 我在 VS2017 的输出中没有收到任何错误 但我设置的一些错误消
  • CUDA 添加矩阵的行

    我试图将 4800x9600 矩阵的行加在一起 得到一个 1x9600 的矩阵 我所做的是将 4800x9600 分成 9 600 个矩阵 每个矩阵长度为 4800 然后我对 4800 个元素进行缩减 问题是 这真的很慢 有人有什么建议吗
  • CUDA 模型 - 什么是扭曲尺寸?

    最大工作组大小和扭曲大小之间有什么关系 假设我的设备有 240 个 CUDA 流处理器 SP 并返回以下信息 CL DEVICE MAX COMPUTE UNITS 30 CL DEVICE MAX WORK ITEM SIZES 512
  • 摆脱异步 cuda 流执行期间的忙等待

    我正在寻找一种方法 如何摆脱以下代码中主机线程中的忙等待 不要复制该代码 它仅显示我的问题的想法 它有许多基本错误 cudaStream t steams S N for int i 0 i lt S N i cudaStreamCreat
  • 在 CUDA 中的设备内存上分配 2D 数组

    如何在 Cuda 中的设备内存中分配和传输 往返于主机 2D 数组 我找到了解决这个问题的方法 我不必展平阵列 内置的cudaMallocPitch 函数完成了这项工作 我可以使用以下命令将阵列传输到设备或从设备传输阵列cudaMemcpy

随机推荐

  • 如何在python中不断更新固定长度的列表?

    抱歉这个菜鸟问题 我刚刚开始编码 我需要跟踪 1 小时的价格历史记录 我希望每秒将值拉入大小为 3600 的列表中 直到列表被填满 然后从那时起每秒将列表向左移动 以便价格保持不变 while True polo exchange retu
  • 如何将自定义事件发送到 PyQt 中的事件循环

    我正在尝试在 PyQt 中发出自定义事件 一个小部件将发出 另一个小部件将侦听事件 但这两个小部件不需要相关 在 JavaScript 中 我会通过这样做来实现这一点 Component 1 document addEventListene
  • 在javascript中计算元音

    我使用此代码来搜索和计算字符串中的元音 a run forest run a a split var syl 0 for var i 0 i lt a length 1 i for var i2 0 i2 lt a i length 1 i
  • systemd 服务未执行通知发送

    我想在 python 脚本中为某些事件生成弹出窗口 我为此目的使用 通知发送 subprocess Popen notify send Authentication True False 上面的命令在终端上执行得很好 但是当我从 syste
  • 如何修复 Cocoapods 中名称冲突的框架?

    我创建了两个私有 Pod 它们都依赖于相同的供应商框架 当我将 pod 添加到我的主项目中时 出现以下错误 target has frameworks with conflicting names FirebaseAnalytics Fir
  • Kotlin karate-junit-5 未找到任何功能或场景[重复]

    这个问题在这里已经有答案了 我正在使用 karate 与 junit 5 runner 和 kotlin 并且 karate 似乎找不到我的功能文件 我得到以下内容 未找到功能或场景 classpath sncf karate org op
  • 如何在查询字符串中传递 HTML 代码

    我需要使用 QueryString 传递 html 代码 因为我使用 ajax 方法在我的网站上发送帖子 我的意思是评论而不是方法的类型 当我写这样的帖子时 Hi everybody br Whats up 它只是将 大家好 删除了其余内容
  • 如何在构建时将其他文件包含到 C# 的输出目录中?

    我的应用程序需要一些库文件才能工作 我的应用程序包含设置和部署 我已经知道 为了在安装时将库文件添加到应用程序的输出目录中 我只需在构建之前在 NET IDE 中引用这些库 唯一的问题是这些库不能被引用 所以我需要能够将这些库复制到我的应用
  • 用户名是通过 WooCommerce 注册中的账单全名自动生成的

    因此 我在 WooCommerce 网上商店的注册页面中添加了各种自定义字段 如下所示 Registration page Add extra fields in registration form add action woocommer
  • Grails:域类映射(hibernate用户类型的集合)

    我想知道是否可以实现以下域模型 让我们有一个包含一组间隔 joda 时间 的域类 我可以使用 org joda time contrib hibernate PersistentInterval hibernate 用户类型将间隔映射到数据
  • Codeigniter中上传文件问题

    这是我在 codeigniter 应用程序中的 uploadinfg 文件代码 function upload logo ex FILES uploadfile name epld explode ex filename date mdyH
  • 如何在代码中分析 JVM 内存?

    我正在编写一个无法在 Eclipse 中测试的 servlet 我需要在服务器上运行 我想做内存分析并查明任何泄漏 所以 我想我需要编写可以告诉我当前内存使用情况的调试语句 有人可以向我指出关于如何执行此操作和 或 JDK 中的哪些类执行此
  • 使用 FieldInfo.SetValue 与 LINQ 表达式在结构中设置字段

    我想使用 LINQ 表达式设置私有字段 我有这个代码 parameter target the object on which to set the field field ParameterExpression targetExp Exp
  • 在 C++ 中,一个类是否可以拥有一个多维数组成员,其维度和范围直到运行时才知道?

    我最初问的是使用嵌套的 std array 创建多维数组 直到运行时才知道维度或范围但这有XY 问题尝试使用 std array 来完成它 问题Boost MultiArray 的一行初始化程序 and 如何使未确定大小的多维数组成为 C
  • Angular 6 如何从多个复选框获取值并发送自

    我正在尝试使用 mat checkboxes 作为表单中的输入 但在文档中找不到任何有关它的内容 Html section class checkbox section section
  • 浏览器 Cookie 永不过期

    我第一次实施使用 HTTPOnly Cookie 登录身份验证 就我而言 当用户调用登录方法时创建的 cookiePython服务与 fastapi 和 uvicorn 我读过MDN文档来实现expires属性 因此 浏览器会在时间到期时删
  • Primefaces 和 jqplot - 在轴上显示日期

    我正在尝试在 PrimeFaces 3 4 中的折线图上使用扩展器属性 我需要使用扩展程序来使用日期 时间值格式化 x 轴 在没有扩展器的情况下执行此操作不是一个选项 因为数据点太多 并且如果我使用默认的 PF lineChart 属性 标
  • WinDbg 应该慢得令人难以忍受吗?

    我正在尝试分析一些小型故障转储 我使用的是 Windows 10 Pro Build 1607 和 WinDbg 10 0 14321 1024 我将符号文件路径设置为 SRV C SymCache https msdl microsoft
  • jquery 更新后切换停止工作

    我在我的网站上使用 jquery 1 3 今天我将其更新到最新的 1 9 并且我的切换 动画脚本停止工作 代码如下所示 a href Show more a div div document ready function toggler t
  • CUDA 中的非方矩阵乘法

    我在 CUDA 中用于矩阵乘法的代码允许我乘以方阵和非方阵 但是 宽度和高度都必须是块大小的倍数 因此 例如 我可以乘以 3 6 6 3 使用blocksize 3 但我不能乘以 3 2 2 3 有谁知道如何做到这一点 这是我的内核 inc