ChatGPT和Claude 对比测试(以Review MLIR Codegen代码为例)

news2024/12/29 0:11:07

Claude在MLIR代码分析上完全超越了ChatGPT并表现十分惊艳,请阅读全文或者自己注册感受它的强大。

0x0. 前言

这里将以oneflow IR部分中的一个Codegen任务(目标是在mlir codegen中支持oneflow stream,用oneflow stream替换pass中自己生成的stream,PR链接为:https://github.com/Oneflow-Inc/oneflow/pull/10149)为例,来对比一下chatgpt和claude对mlir的理解能力。claude是Anthropic公司推出的类似于chatgpt的聊天机器人,这家公司是OpenAI的最大竞争对手之一,因为创办这家公司的人也是OpenAI的前员工。本次使用的chatgpt可以在这个 https://chatbot.theb.ai/#/chat/1002 访问。然后Claude是参考这个issue: https://www.zhihu.com/question/594115372/answer/2988759047 将其直接添加到slack里进行对话。

0x1. PR简介

PR链接为:https://github.com/Oneflow-Inc/oneflow/pull/10149

这个PR实现了3个Pass (定义在 OneFlowPasses.td),也就是:

def EliminateAllocOpsPass : Pass<"eliminate-alloc-ops", "ModuleOp"> {
  let summary = "";
  let constructor = "mlir::oneflow::createEliminateAllocOpsPass()";
  let dependentDialects = ["pdl_interp::PDLInterpDialect", "pdl::PDLDialect"];
}

def AppendOneFlowStreamPass : Pass<"append-ofstream", "ModuleOp"> {
  let summary = "append oneflow stream to gpu function arguments";
  let constructor = "mlir::oneflow::createAppendOneFlowStreamPass()";
}

def MgpuToOneFlowStreamPass : Pass<"mgpu-to-ofstream", "ModuleOp"> {
  let summary = "convert mlir abi about mgpu to oneflow stream, this pass should be invoked after append-ofstream pass";
  let constructor = "mlir::oneflow::createMgpuToOneFlowStreamPass()";
}

EliminateAllocOpsPass用来消除IR中的无效memref.alloc指令,AppendOneFlowStreamPass给GPU相关的函数添加GPU启动kernel需要的stream参数,MgpuToOneFlowStreamPass发生在AppendOneFlowStreamPass执行之后(它生成了stream参数)并把mgpu相关的stream abi替换为oneflow stream abi。

我们分别使用newbing和claude来让它们分析一下这几行OneFlowPasses.td中定义的Pass意图:

newbing:

在这里插入图片描述

newbing直接看不懂,其实我感觉claude也应该看不懂吧,抱着怀疑的态度问一下。

在这里插入图片描述
在这里插入图片描述

太疯狂了,claude不仅读懂了td文件的代码,甚至为我们列出了这个代码涉及到的MLIR概念。感觉是训练数据考虑了MLIR相关的预料?接下来我们再对比下C++实现的Pass代码。

0x2. 对比具体实现

PR链接为:https://github.com/Oneflow-Inc/oneflow/pull/10149

0x2.1 EliminateAllocOpsPass

EliminateAllocOpsPass使用MLIR提供的PDL语言来完成Pattern的匹配和重写,具体实现在 oneflow/ir/lib/OneFlow/PDLL/AllocEliminationPatterns.pdll

#include "OneFlow/OneFlowOps.td"

Constraint IsFuncArguments(value: Value) [{
  return success(llvm::dyn_cast<mlir::BlockArgument>(value));
}];

Pattern {
  let alloc = op<memref.alloc>();
  let copy = op<memref.copy>(alloc.0, arg: IsFuncArguments);

  rewrite alloc with {
    erase copy;
    replace alloc with arg;
  };
}

接下来,我们分别对比一下newbing和chatgpt对它的分析结果。

在这里插入图片描述

newbing并不能解析出这段代码是MLIR的PDL语言,当然也无法理解代码内容。我们可以再使用Claude试试。

在这里插入图片描述

在这里插入图片描述

个人感觉这个解释是非常强大且精准的,Claude的答案非常惊艳。

0x2.2 AppendOneFlowStreamPass

接下来我们看一下AppendOneFlowStreamPass的实现,这个实现是在oneflow/ir/lib/OneFlow/Transform/OneFlowStream.cpp这个文件,具体代码如下:

struct AppendOneFlowStreamPattern final : public OpRewritePattern<func::FuncOp> {
 public:
  explicit AppendOneFlowStreamPattern(mlir::MLIRContext* context)
      : OpRewritePattern<func::FuncOp>(context, /*benefit=*/0) {}
  mlir::LogicalResult matchAndRewrite(func::FuncOp op,
                                      mlir::PatternRewriter& rewriter) const override {
    auto ptr_type = LLVM::LLVMPointerType::get(IntegerType::get(rewriter.getContext(), 8));
    if (llvm::dyn_cast<LLVM::LLVMPointerType>(op.getFunctionType().getInputs().back()))
      return success();

    llvm::SmallVector<Type> new_operand_type;
    for (auto type : op.getFunctionType().getInputs()) { new_operand_type.push_back(type); }
    new_operand_type.push_back(ptr_type);
    auto function_type =
        rewriter.getFunctionType(new_operand_type, op.getFunctionType().getResults());

    auto func = rewriter.create<func::FuncOp>(op.getLoc(), op.getName(), function_type);
    for (auto pair : op->getDialectAttrs()) { func->setAttr(pair.getName(), pair.getValue()); }
    op.getBody().addArgument(ptr_type, func->getLoc());
    IRMapping bvm;
    op.getRegion().cloneInto(&func.getRegion(), bvm);
    rewriter.eraseOp(op);
    return success();
  }
};

c++代码newbing(chatgpt)按道理可以看懂了,我们让它分析一下:

在这里插入图片描述

直接问chatgpt,它还是不懂这段代码。我手动提示了下它说,这段代码定义了一个mlir pattern,然后它先是重复我的话给出了一段回答。然后接下来就是胡说八道了,在这个例子中表现很差。接下来我们拷问一下Claude:

在这里插入图片描述
在这里插入图片描述

我们继续问一下c++代码中的一些细节:

在这里插入图片描述
在这里插入图片描述

非常强大,给出的解释大多比较精准,并且似乎Claude真的完全理解了这段代码的逻辑。我们需要注意的是,这段代码是我同事今天才写的,模型的泛化性真的很好。

MgpuToOneFlowStreamPass

我们最后再分析下MgpuToOneFlowStreamPass的实现。

struct MgpuToOneFlowStreamPattern final : public OpRewritePattern<LLVM::CallOp> {
 public:
  explicit MgpuToOneFlowStreamPattern(mlir::MLIRContext* context)
      : OpRewritePattern<LLVM::CallOp>(context, /*benefit=*/0) {}
  mlir::LogicalResult matchAndRewrite(LLVM::CallOp op,
                                      mlir::PatternRewriter& rewriter) const override {
    auto ptr_type = LLVM::LLVMPointerType::get(IntegerType::get(rewriter.getContext(), 8));
    auto func = op->getParentOfType<LLVM::LLVMFuncOp>();
    auto callee = op.getCallee();
    if (!func || !callee) return failure();
    Value stream = func.getArguments().back();
    if (stream.getType() != ptr_type) {
      LOG(ERROR) << "failed to find stream in llvm.func block arguments";
      return failure();
    }

    DenseMap<StringRef,
             std::pair<std::function<bool(LLVM::CallOp&, Value&)>,
                       std::function<void(mlir::PatternRewriter&, LLVM::CallOp&, Value&)>>>
        oneflow_abi = {
            {"mgpuStreamCreate",
             {[](LLVM::CallOp& op, Value& stream) { return true; },
              [](mlir::PatternRewriter& rewriter, LLVM::CallOp& op, Value& stream) {
                rewriter.replaceOp(op, {stream});
              }}},
            {"mgpuLaunchKernel",
             {[](LLVM::CallOp& op, Value& stream) {
                unsigned idx = op->getNumOperands();
                return op.getOperand(idx - 3) != stream;
              },
              [](mlir::PatternRewriter& rewriter, LLVM::CallOp& op, Value& stream) {
                unsigned idx = op->getNumOperands();
                auto target = op.getOperand(idx - 3).getDefiningOp();
                rewriter.replaceOp(target, {stream});
              }}},
            {"mgpuStreamSynchronize",
             {[](LLVM::CallOp& op, Value& stream) { return true; },
              [](mlir::PatternRewriter& rewriter, LLVM::CallOp& op, Value& stream) {
                rewriter.eraseOp(op);
              }}},
            {"mgpuStreamDestroy",
             {[](LLVM::CallOp& op, Value& stream) { return true; },
              [](mlir::PatternRewriter& rewriter, LLVM::CallOp& op, Value& stream) {
                rewriter.eraseOp(op);
              }}},
        };
    auto out = oneflow_abi.find(callee.value().str());
    if (out != oneflow_abi.end() && out->getSecond().first(op, stream)) {
      out->getSecond().second(rewriter, op, stream);
    }
    return success();
  }
};

还是先让chatgpt分析下:

在这里插入图片描述

回答还是比较模棱两可,并且可以确定的事情是chatgpt完全没有理解这段代码。

接下来还是使用Claude来测试下:

在这里插入图片描述

这个地方让我震惊的点是,它不仅理解了这段代码,而且知道在MLIR里面这段代码只是一个Pattern规则,如果要应用这个规则需要在MLIR里面再构建一个Pass。最后我们再让Claude给我们一些Review意见:

在这里插入图片描述

这里的第4点提示让我感到有些疑惑,我还请教了下同事,顺便让同事补充一下注释。

在这里插入图片描述

整体来说,在阅读MLIR代码方面,Claude已经相当智能,全面领先Newbing(Chatgpt),感觉以后可以日常用Claude来辅助Review IR相关代码。

0x3. 总结

我这里以MLIR的一个任务对比了一下ChatGpt和Claude,我感受到了Calude的强大之处。虽然暂时还没有评测过别的任务,但我已经被Calude表现出来的代码分析能力所震撼。我们甚至可以将Claude作为一个入门AI编译器的入门工具

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10个前端开发者需要掌握的DOM技巧

Web开发不断发展&#xff0c;掌握最新的趋势和最佳实践对每位开发者来说都至关重要。Web开发的最重要方面之一就是使用文档对象模型&#xff08;DOM&#xff09;。这篇文章中&#xff0c;小蓝将与大家共同探讨10个必须掌握的DOM技巧&#xff0c;帮助您成为更高效、更有效的开发…

CSS—javaEE

文章目录1.引入的方式1.1作为HTML的标签属性1.2style标签1.3link标签外部引入css文件2.基础选择器2.1标签选择器2.2类选择器2.3id选择器2.4通配符选择器3.复合选择器3.1后代选择器3.2子选择器3.3并集选择器3.4伪类选择器4.设置样式4.1字体4.2文本4.3背景4.4圆角5.显示模式6.盒模…

【Linux】HTTP超文本传输协议

http主要用在浏览器和web服务器通信&#xff0c;是基于TCP协议的应用层无连接的传输协议。 HTTP与HTTPS http是明文数据传输&#xff0c;如果攻击者截取了Web浏览器和网站服务器之间的传输报文&#xff0c;就可以直接读懂其中的信息。协议使用端口号&#xff1a;80。 https更…

AIGC:数字内容创新的新引擎,还有藏着更多你知道的细节

随着技术的不断发展进步&#xff0c;在前两年对我们还是天方夜谭&#xff0c;可望而不可即的科技&#xff0c;现在不仅在逐步实现&#xff0c;甚至在广泛地普及应用中。人工智能技术应用在越来越多的行业中&#xff0c;在一定程度上对各行业的发展起了不小的推动作用&#xff0…

教你如何将PDF文件转换成PPT演示文稿

在工作和学习中&#xff0c;我们可能需要将一些PDF文件转换成PPT演示文稿&#xff0c;以便于更好地展示和分享。虽然PPT和PDF是两种不同的文档格式&#xff0c;但是我们可以使用一些专业的软件或在线工具来实现这种转换。下面就让我们来教你如何将PDF文件转换成PPT演示文稿。 …

Java 简介

Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发&#xff0c;并在 1995 年正式推出。 后来 Sun 公司被 Oracle &#xff08;甲骨文&#xff09;公司收购&#xff0c;Java 也随之成为 O…

RabbitMQ 发布确认 交换机 死信队列 延迟队列

RabbitMQ 发布确认开启发布确认的方法单个确认发布批量消息确认发布异步确认发布如何处理异步未确认消息 交换机绑定Fanout交换机Fannout交换机&#xff08;消费者&#xff09;Fannout交换机&#xff08;生产者&#xff09; Direct exchage(直接交换机)生产者消费者 Topic交换机…

遥感影像变化检测新方法:MLDANets

来源&#xff1a;投稿 作者&#xff1a;xin 编辑&#xff1a;学姐 论文标题&#xff1a; Multilevel Deformable Attention-Aggregated Networks for Change Detection in Bitemporal Remote Sensing Imagery Motivation 本文指出: &#xff08;1&#xff09;当前基于自注意…

Spring AOP通知类型

我们之前的文章介绍了AOP通知描述了抽取的共性功能&#xff0c;根据共性功能抽取的位置不同&#xff0c;最终运行代码时要将其加入到合理的位置。 先来认识一下五种通知的具体类型&#xff1a; 前置通知后置通知环绕通知(重点)返回后通知(了解)抛出异常后通知(了解) &#x1f…

(4)(4.6) 强制性硬件配置

文章目录 前言 1 ArduPilot操作的简单概述 2 框架类和类型配置 3 电机编号和方向 4 无线电控制校准 5 加速度计校准 6 罗盘校准 7 遥控发射器飞行模式配置 8 电子调速器(ESC)校准 9 配置电机范围(可选) 10 失控保护机制 11 飞行模式 前言 作为首次安装的一部分&am…

深度卷积神经网络DCNN简介

1. 背景 卷积神经网络CNN&#xff08;Convolutional Neural Network&#xff0c;又称ConvNet&#xff09;保留了空间信息&#xff0c;因此可以更好地用于图像分类。 卷积操作基于仔细甄选的局部感受野&#xff0c;在多个特征平面共享权值&#xff1b;之后全连接层基于传统的多层…

C++之 多态(Polymorphism)

目录 一、基本概念 多态的使用&#xff1a; 案例一——计算机类 多态的优点&#xff1a; 二、纯虚函数与抽象类 特点&#xff1a; ①无法实例化对象 ②子类必须重写父类中的纯虚函数&#xff0c;否则也属于抽象类 案例二——制作饮品 三、虚析构与纯虚析构 因为父类指…

【C++】结构体嵌套结构体

目录 1、缘起 2、结构体嵌套结构体 3、总结 1、缘起 结构体嵌套结构体 是一种数据组织方式&#xff0c;就像 俄罗斯套娃 一样&#xff0c;一个数据结构可以包含另一个数据结构。这种嵌套结构使得程序可以更加灵活地处理数据&#xff0c;从而更好地满足复杂的需求。类比生活中…

Java之~ Aop自定义注解日志

大纲步骤&#xff1a; 一&#xff0c;创建需要记录的日志表&#xff0c;创建基础方法。&#xff08;省略&#xff09; 二&#xff0c;在需要加记录日志的方法上加Aop注解1&#xff0c;创建一个注解类&#xff0c;Aop中定义一个注解import java.lang.annotation.*; /*** http 请…

银行数字化转型导师坚鹏:商业银行零售业务数字化风控

商业银行零售业务数字化风控课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚商业银行数字化风控发展现状&#xff1f; 不清楚对公业务数字化风控工作如何开展&#xff1f; 不知道零售业务数字化风控工作如何开展&#xff1f; 课程特…

十三、RNN循环神经网络实战

因为我本人主要课题方向是处理图像的&#xff0c;RNN是基本的序列处理模型&#xff0c;主要应用于自然语言处理&#xff0c;故这里就简单的学习一下&#xff0c;了解为主 一、问题引入 已知以前的天气数据信息&#xff0c;进行预测当天(4-9)是否下雨 日期温度气压是否下雨4-…

拦截器 JWT SpringBoot 多环境开发 本地文件上传 阿里云OSS存储 异常处理

Springboot&#xff1a; 是&#xff1a;由pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化spring应用的初始搭建以及开发过程 作用&#xff1a;简化Spring的环境搭建和代码开发 使用原理&#xff1a;就是boot提前写好了一些maven的工程和jar包&#xff0c;程序员在…

Android屏幕适配dp、px两套解决办法

最新最全文章(2018-08-25)&#xff1a;Android dp方式的屏幕适配-原理(后期补充完整讲解)_手机dp输出是横屏还是竖屏_android阿杜的博客-CSDN博客 “又是屏幕适配&#xff0c;这类文章网上不是很多了吗&#xff1f;” 我也很遗憾&#xff0c;确实又是老问题。但本文重点对网上…

ChatGPT来势凶猛,公有云格局会不会大变?

【引言】&#xff1a; AI风暴来袭&#xff0c;全球无人幸免。 但公有云与ChatGPT到底啥关系&#xff1f; 1) 公有云与ChatGPT&#xff0c;到底谁会“吃”掉谁&#xff1f; 【科技明说 &#xff5c; 热点关注】在看到公有云厂商纷纷开始大模型发布&#xff0c;开始GPT的融入之…

虹科教您 | 基于Linux系统的虹科RELY-TSN-KIT套件操作指南(2)——操作演示

RELY-TSN-KIT是首款针对TSN的开箱即用的解决方案&#xff0c;它可以无缝实施确定性以太网网络&#xff0c;并从这些技术复杂性中抽象出用户设备和应用。该套件可评估基于IEEE 802.1AS同步的时间常识的重要性&#xff0c;并借助时间感知整形器来确定性地交付实时流量&#xff0c…