如何在CUBLAS中计算复数幂?

2024-02-07

我正在将我的 C++ 代码移植到 CUDA 和 CUBLAS。我使用 stl::complex 进行复杂计算(即 pow、log、exp 等),但我没有看到 CuComplex 库中定义的相同函数。我不知道如何创建这些功能,但我在网上找到了一些代码

#include <iostream>
#include <cublas_v2.h>
#include <cuComplex.h>
using namespace std;

typedef cuDoubleComplex Complex;

#define complex(x, y) make_cuDoubleComplex(x, y)

__host__ __device__ double cabs(const Complex& z) {return cuCabs(z);}
__host__ __device__ double carg(const Complex& z) {return atan2(cuCreal(z),   cuCimag(z));}
__host__ __device__ Complex polar(const double &magnitude, const double &angle) {return complex(magnitude*cos(angle), magnitude*sin(angle));}
__host__ __device__ Complex cexp(const Complex& z) {return polar( exp(cuCreal(z)), cuCimag(z));}
__host__ __device__ Complex czlog(const Complex& z) {return complex( ::log(cabs(z)), carg(z) );}
__host__ __device__ Complex cpow(const Complex& z, const int &exponent) {return cexp( cuCmul(czlog(z), complex((double )exponent, 0)) );}

void main(void)
{
  Complex z=complex(0.34, 0.56);
  cout << cuCreal(cpow(z, 2)) << "  " << cuCimag(cpow(z, 2)) << endl;
}

上面的结果没有给出正确的答案。 cpow有什么问题吗?对复数执行幂和其他函数是否更好?


这是不正确的:

__host__ __device__ double carg(const Complex& z) {return atan2(cuCreal(z),   cuCimag(z));}

The 复数的极角 http://algebra.nipissingu.ca/tutorials/complex_numbers.html由复数的虚部除以实部的反正切给出。这对应于第一个参数除以第二个参数的比率atan2 http://docs.nvidia.com/cuda/cuda-math-api/group__CUDA__MATH__SINGLE.html#group__CUDA__MATH__SINGLE_1gd89b766e91b1c84f2e8e81beb750707d

因此你应该使用:

__host__ __device__ double carg(const Complex& z) {return atan2(cuCimag(z),   cuCreal(z));}

我不确定你的幂函数(cpow) 任何一个。你有没有尝试过德莫弗定理 http://algebra.nipissingu.ca/tutorials/complex_numbers.html?我不知道最好的计算方法,但似乎首要任务是得到正确的答案。

补充笔记:

  1. 我认为这个问题与CUBLAS没有任何关系
  2. 当发布这样的问题时,如果您给出您正在观察的实际结果以及预期结果,将会很有帮助。

这是一个基于德莫弗定理的有效示例:

$ cat t233.cu
#include <iostream>
#include <math.h>
#include <cuComplex.h>
#include <complex>

typedef double     rtype;
typedef cuDoubleComplex ctype;
#define rpart(x)   (cuCreal(x))
#define ipart(x)   (cuCimag(x))
#define cmplx(x,y) (make_cuDoubleComplex(x,y))

__host__ __device__ rtype carg(const ctype& z) {return (rtype)atan2(ipart(z), rpart(z));} // polar angle
__host__ __device__ rtype cabs(const ctype& z) {return (rtype)cuCabs(z);}
__host__ __device__ ctype cp2c(const rtype d, const rtype a) {return cmplx(d*cos(a), d*sin(a));}
__host__ __device__ ctype cpow(const ctype& z, const int &n) {return cmplx((pow(cabs(z), n)*cos(n*carg(z))), (pow(cabs(z), n)*sin(n*carg(z))));}

int main(){

  double r = 0.34;
  double i = 0.56;
  int n = 2;

  std::complex<double> stl_num(r,i);
  std::complex<double> cn(n,0);
  ctype cu_num = cmplx(r,i);

  std::complex<double> stl_ans = std::pow(stl_num, cn);
  ctype cu_ans = cpow(cu_num, n);

  std::cout << "STL real: " << std::real(stl_ans) << " STL imag: " << std::imag(stl_ans) << std::endl;
  std::cout << "CU  real: " << rpart(cu_ans) << " CU  imag: " << ipart(cu_ans) << std::endl;
  return 0;
}
$ nvcc -arch=sm_20 -O3 -o t233 t233.cu
$ ./t233
STL real: -0.198 STL imag: 0.3808
CU  real: -0.198 CU  imag: 0.3808
$

我并不是说这是经过彻底测试的代码,但它似乎处于正确的轨道上,并为您的测试用例提供了正确的答案。

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

如何在CUBLAS中计算复数幂? 的相关文章

  • Cuda 计算模式和“CUBLAS_STATUS_ALLOC_FAILED”

    我的集群中有一台主机 有 8 个Nvidia K80我想将其设置为每个设备最多可以运行 1 个进程 以前 如果我在主机上运行多个作业并且每个作业都使用大量内存 它们都会尝试访问同一设备并失败 我将所有设备设置为计算模式 3 E Proces
  • 在 Windows 上的 Qt Creator 中编译 Cuda 代码

    几天来我一直在尝试获取在 32 位 Windows 7 系统上运行的 Qt 项目文件 我希望 需要在其中包含 Cuda 代码 这种组合要么非常简单 以至于没有人愿意在网上放一个例子 要么非常困难 似乎没有人成功 不管怎样 我发现的唯一有用的
  • 加强托管线程和操作系统线程之间的关系(CUDA 用例)

    Problem 我正在尝试创建一个与 net 良好集成的 CUDA 应用程序 设计目标是拥有多个可以从托管代码调用的 CUDA 函数 数据还应该能够在函数调用之间保留在设备上 以便可以将其传递给多个 CUDA 函数 重要的是 每个单独的数据
  • nvcc fatal:安装 cuda 9.1+caffe+openCV 3.4.0 时不支持 gpu 架构“compute_20”

    我已经安装了CUDA 9 1 cudnn 9 1 opencv 3 4 0 caffe 当我尝试跑步时make all j8 in caffe目录下 出现这个错误 nvcc fatal 不支持的 GPU 架构 compute 20 我尝试过
  • 优化三角矩阵计算的 CUDA 内核的执行

    我正在开发我的第一个 Cuda 应用程序 并且我的内核 吞吐量低于预期 这似乎是目前最大的瓶颈 内核的任务是计算一个 N N 大小的矩阵 DD 包含数据矩阵上所有元素之间的平方距离 数据矩阵 Y 的大小为 N D 以支持多维数据 并存储为行
  • 无法从静态初始化代码启动 CUDA 内核

    我有一个在其构造函数中调用内核的类 如下所示 标量场 h include
  • 如何在 gitlab-ci docker 执行器中使用 cuda

    我们正在使用 gitlab 持续集成来构建和测试我们的项目 最近 其中一个项目添加了 CUDA 的要求以启用 GPU 加速 我不想改变我们的管道 docker 和 gitlab ci 对我们来说运行良好 所以我想以某种方式让 docker
  • cudaMemcpyToSymbol 与 cudaMemcpy [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图找出
  • 为什么 gcc 和 NVCC (g++) 会看到两种不同的结构大小?

    我正在尝试将 CUDA 添加到 90 年代末编写的现有单线程 C 程序中 为此 我需要混合两种语言 C 和 C nvcc 是 c 编译器 问题在于 C 编译器将结构视为特定大小 而 C 编译器将相同的结构视为略有不同的大小 那很糟 我对此感
  • 当我有表面声明时,如何为 sm_1X 和 sm_2X 编译 CUDA 程序

    我正在编写一个使用表面 重新采样并写入纹理 来提高性能的库 surface
  • CUDA 中的广义霍夫变换 - 如何加快分箱过程?

    正如标题所示 我正在对并行计算机视觉技术进行一些个人研究 使用 CUDA 我尝试实现 GPGPU 版本的霍夫变换 我遇到的唯一问题是在投票过程中 我调用atomicAdd 来防止多个同时写入操作 但我似乎没有获得太多的性能效率 我在网上搜索
  • Visual Studio - 过滤掉 nvcc 警告

    我正在编写 CUDA 程序 但收到令人讨厌的警告 Warning Cannot tell what pointer points to assuming global memory space 这是来自 nvcc 我无法禁用它 有没有办法过
  • MPI+CUDA 与纯 MPI 相比有何优势?

    加速应用程序的常用方法是使用 MPI 或更高级别的库 例如在幕后使用 MPI 的 PETSc 并行化应用程序 然而 现在每个人似乎都对使用 CUDA 来并行化他们的应用程序或使用 MPI 和 CUDA 的混合来解决更雄心勃勃 更大的问题感兴
  • 如何确定完整的 CUDA 版本 + 颠覆版本?

    Linux 上的 CUDA 发行版曾经有一个名为version txt例如 CUDA Version 10 2 89 这非常有用 但是 从 CUDA 11 1 开始 该文件不再存在 我如何在 Linux 上通过命令行确定并检查 path t
  • 设置最大 CUDA 资源

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

    要更改哪一部分来加速此代码 代码到底在做什么 global void mat Matrix a Matrix b int tempData new int 2 tempData 0 threadIdx x tempData 1 blockI
  • 在 __device/global__ CUDA 内核中动态分配内存

    根据CUDA 编程指南 http developer download nvidia com compute cuda 3 2 prod toolkit docs CUDA C Programming Guide pdf 第 122 页 可
  • CUDA 矩阵加法时序,按行与按行比较按栏目

    我目前正在学习 CUDA 并正在做一些练习 其中之一是实现以 3 种不同方式添加矩阵的内核 每个元素 1 个线程 每行 1 个线程和每列 1 个线程 矩阵是方阵 并被实现为一维向量 我只需用以下命令对其进行索引 A N row col 直觉
  • cuda中内核的并行执行

    可以说我有三个全局数组 它们已使用 cudaMemcpy 复制到 GPU 中 但 c 中的这些全局数组尚未使用 cudaHostAlloc 分配 以便分配页面锁定的内存 而不是简单的全局分配 int a 100 b 100 c 100 cu
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I

随机推荐

  • mysql 的“BETWEEN”性能是多少?

    在 特别是 mysql 中查询以下内容时是否有更好的性能 SELECT FROM table WHERE unix date BETWEEN 1291736700 AND 1291737300 over SELECT FROM table
  • 表删除后重置 id 计数()

    出于测试目的 我在执行代码之前清除 删除 每个表 for table in reversed db metadata sorted tables engine execute table delete do stuff 然而 新数据的id值
  • android:如何以编程方式获取给定PID的内存使用量(ram)

    我想记录给定应用程序在给定时间速率下的内存使用情况 我编写了代码来获取已使用的完整内存值 但不知道如何获取给定 PID 的内存使用情况 请帮帮我 这是我用来获取内存的代码 ActivityManager localActivityManag
  • 在 LINQ 中展平列表

    我有一个返回的 LINQ 查询IEnumerable
  • NoSuchMethodError:谷歌常见 ImmutableSet.copyOf(..)

    我从 1 7 升级了我的 Google app Engine 应用程序 至 1 8 Java 7 和我将所有 API 库升级为最新 我在 GAE 容器中的应用程序初始化期间遇到奇怪的异常 构造函数抛出异常 嵌套异常是java lang No
  • 如何监听vscode的TreeDataProvider中的事件?

    我正在使用 TreeDataProvider API 构建 vscode 扩展 我有一个显示内容的列表 每个 TreeItem 都是一个组成的标签字符串 一切正常 我缺少的是一种对任何项目上的点击事件做出反应的方式 当您单击该项目时 VSC
  • 如何对 Entity-Bean @OneToMany 关系应用默认限制

    我有两个实体模型 客户和订单 每个顾客都可以拥有数千的订单 我在这两个实体之间有 OneToMany 和 ManyToOne 关系 如何将此关系的列表限制为仅前 10 个订单 是否可以将 WHERE 条件作为 OneToMany 的属性应用
  • 如何使父类的模板方法对子类可见?

    这是示例代码 include
  • 滑块无响应

    我下面有一些数据 我想创建数年和数月的滑块 我有一列包含年份和月份 另外 我是闪亮的新手 所以这对我来说很新鲜 这是我尝试过的 stack qn lt structure list Date c 2012 01 2012 02 2012 0
  • 对可执行文件进行数字签名有多重要?

    我们生产内容管理系统 它是一个基于数据库的系统 仅供企业和组织使用 并且不能从互联网上下载 也就是说 它不是那种人们可能会偶然发现并想知道它是什么以及运行是否安全的软件 我们的系统销售了 20 多年 其可执行文件从未经过数字签名 我们是时候
  • 显示 PHP 文件中的 404 错误页面,无需重定向

    我有一个文件secret php其中包含在index php我想在有人尝试访问时显示 404 错误页面secret php直接地 但 header Location this site certainly does not exist in
  • CComboBox 下拉时未选择 CurSel

    我在对话框中有一个按字母顺序排序的组合框 该组合包含多个字符串 但有些字符串在不同情况下重复 即我们有一个 开 和一个 开 一个 关 和一个 关 这看起来似乎多余 但这是有原因的 尽管现在这并不重要 重复项显然是一个接一个地出现在列表中 大
  • CSS background-clip:来自父元素背景的文本

    我想得到一个background clip text在子 div 上从父 div 获取其背景 基本上它应该看起来像文本被剪掉了 当背景位于同一元素上时很容易做到 但我似乎无法弄清楚背景何时位于不同的 div 上 background wid
  • 导入我的非托管解决方案不会更改帐户表单

    我在 CRM 中有一个定制的帐户 主 表单 我在其中添加了一个新选项卡 一个新部分和新字段 我事先发布了所有自定义内容 然后导出 然后导入到我的测试环境中 我都是在测试环境下发布的 非托管解决方案包含此表单及其新字段 当我查看导出的 zip
  • 如何制作iOS资源包?

    我在评估的 iOS 项目中看到了一个自定义资源包 所以至少我知道这是可能的 我的问题是 我对给定图像使用大约 22 000 个图块的 CATiledLayer 并且编译需要很长时间 干净构建需要半小时 常规构建需要 5 10 分钟 因此 我
  • HTML 垂直对齐失败?

    我有一个由 2 个文本框组成的简单表单 我只是想让表单出现在页面中间 页面中没有任何额外的元素 通过使用align center 元素确实移动到中心 但情况并非如此vertical align middle
  • Java UI,尝试在单击按钮后转到下一页

    我有一个简单的 GUI 带有 3 个单选按钮和一个按钮 我希望用户选择一个单选选项 然后单击该按钮后 用户将根据他们选择的单选按钮被定向到不同的 Java UI 这是我的方法 private void btnContinueActionPe
  • 在网站上动态生成 SVG 图像是否明智?

    我刚刚学习 SVG 它看起来很棒 但我不确定浏览器支持 人们是否成功解决了这个问题 还是还为时过早 Raphael http raphaeljs com 是一个跨浏览器矢量图形库 可能值得一看
  • 将 Kotlin + Java 与 Maven 混合,未解决的参考

    我有一个带有 Kotlin 代码的 Maven 项目hello kt它调用 Java 代码JavaFoo java调用 Kotlin 代码KotlinFoo kt hello kt还打电话KotlinFoo kt直接地 我正在尝试用mvn
  • 如何在CUBLAS中计算复数幂?

    我正在将我的 C 代码移植到 CUDA 和 CUBLAS 我使用 stl complex 进行复杂计算 即 pow log exp 等 但我没有看到 CuComplex 库中定义的相同函数 我不知道如何创建这些功能 但我在网上找到了一些代码