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
),也就是:
defEliminateAllocOpsPass:Pass<"eliminate-alloc-ops","ModuleOp">{
letsummary="";
letconstructor="mlir::createEliminateAllocOpsPass()";
letdependentDialects=["pdl_interp::PDLInterpDialect","pdl::PDLDialect"];
}
defAppendOneFlowStreamPass:Pass<"append-ofstream","ModuleOp">{
letsummary="appendoneflowstreamtogpufunctionarguments";
letconstructor="mlir::createAppendOneFlowStreamPass()";
}
defMgpuToOneFlowStreamPass:Pass<"mgpu-to-ofstream","ModuleOp">{
letsummary="convertmlirabiaboutmgputooneflowstream,thispassshouldbeinvokedafterappend-ofstreampass";
letconstructor="mlir::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"
ConstraintIsFuncArguments(value:Value)[{
returnsuccess(llvm::dyn_cast(value));
}];
Pattern{
letalloc=op();
letcopy=op(alloc.0,arg:IsFuncArguments);
rewriteallocwith{
erasecopy;
replaceallocwitharg;
};
}
接下來,我們分別對比一下newbing和chatgpt對它的分析結果。
在這里插入圖片描述newbing并不能解析出這段代碼是MLIR的PDL語言,當然也無法理解代碼內容。我們可以再使用Claude試試。
在這里插入圖片描述在這里插入圖片描述個人感覺這個解釋是非常強大且精準的,Claude的答案非常驚艷。
0x2.2 AppendOneFlowStreamPass
接下來我們看一下AppendOneFlowStreamPass的實現,這個實現是在oneflow/ir/lib/OneFlow/Transform/OneFlowStream.cpp
這個文件,具體代碼如下:
structAppendOneFlowStreamPatternfinal:publicOpRewritePattern{
public:
explicitAppendOneFlowStreamPattern(mlir::MLIRContext*context)
:OpRewritePattern(context,/*benefit=*/0) {}
mlir::LogicalResultmatchAndRewrite(func::FuncOpop,
mlir::PatternRewriter&rewriter)constoverride{
autoptr_type=LLVM::get(rewriter.getContext(),8));
if(llvm::dyn_cast(op.getFunctionType().getInputs().back()))
returnsuccess();
llvm::SmallVectornew_operand_type;
for(autotype:op.getFunctionType().getInputs()){new_operand_type.push_back(type);}
new_operand_type.push_back(ptr_type);
autofunction_type=
rewriter.getFunctionType(new_operand_type,op.getFunctionType().getResults());
autofunc=rewriter.create(op.getLoc(),op.getName(),function_type);
for(autopair:op->getDialectAttrs()){func->setAttr(pair.getName(),pair.getValue());}
op.getBody().addArgument(ptr_type,func->getLoc());
IRMappingbvm;
op.getRegion().cloneInto(&func.getRegion(),bvm);
rewriter.eraseOp(op);
returnsuccess();
}
};
c++代碼newbing(chatgpt)按道理可以看懂了,我們讓它分析一下:
在這里插入圖片描述直接問chatgpt,它還是不懂這段代碼。我手動提示了下它說,這段代碼定義了一個mlir pattern,然后它先是重復我的話給出了一段回答。然后接下來就是胡說八道了,在這個例子中表現很差。接下來我們拷問一下Claude:
我們繼續問一下c++代碼中的一些細節:
非常強大,給出的解釋大多比較精準,并且似乎Claude真的完全理解了這段代碼的邏輯。我們需要注意的是,這段代碼是我同事今天才寫的,模型的泛化性真的很好。
MgpuToOneFlowStreamPass
我們最后再分析下MgpuToOneFlowStreamPass的實現。
structMgpuToOneFlowStreamPatternfinal:publicOpRewritePattern{
public:
explicitMgpuToOneFlowStreamPattern(mlir::MLIRContext*context)
:OpRewritePattern(context,/*benefit=*/0) {}
mlir::LogicalResultmatchAndRewrite(LLVM::CallOpop,
mlir::PatternRewriter&rewriter)constoverride{
autoptr_type=LLVM::get(rewriter.getContext(),8));
autofunc=op->getParentOfType();
autocallee=op.getCallee();
if(!func||!callee)returnfailure();
Valuestream=func.getArguments().back();
if(stream.getType()!=ptr_type){
LOG(ERROR)<"failedtofindstreaminllvm.funcblockarguments";
returnfailure();
}
DenseMapstd::pair<std::function<bool(LLVM::CallOp&,Value&)>,
std::function<void(mlir::PatternRewriter&,LLVM::CallOp&,Value&)>>>
oneflow_abi={
{"mgpuStreamCreate",
{[](LLVM::CallOp&op,Value&stream){returntrue;},
[](mlir::PatternRewriter&rewriter,LLVM::CallOp&op,Value&stream){
rewriter.replaceOp(op,{stream});
}}},
{"mgpuLaunchKernel",
{[](LLVM::CallOp&op,Value&stream){
unsignedidx=op->getNumOperands();
returnop.getOperand(idx-3)!=stream;
},
[](mlir::PatternRewriter&rewriter,LLVM::CallOp&op,Value&stream){
unsignedidx=op->getNumOperands();
autotarget=op.getOperand(idx-3).getDefiningOp();
rewriter.replaceOp(target,{stream});
}}},
{"mgpuStreamSynchronize",
{[](LLVM::CallOp&op,Value&stream){returntrue;},
[](mlir::PatternRewriter&rewriter,LLVM::CallOp&op,Value&stream){
rewriter.eraseOp(op);
}}},
{"mgpuStreamDestroy",
{[](LLVM::CallOp&op,Value&stream){returntrue;},
[](mlir::PatternRewriter&rewriter,LLVM::CallOp&op,Value&stream){
rewriter.eraseOp(op);
}}},
};
autoout=oneflow_abi.find(callee.value().str());
if(out!=oneflow_abi.end()&&out->getSecond().first(op,stream)){
out->getSecond().second(rewriter,op,stream);
}
returnsuccess();
}
};
還是先讓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編譯器的入門工具
審核編輯 :李倩
-
gpu
+關注
關注
28文章
4702瀏覽量
128710 -
編譯器
+關注
關注
1文章
1618瀏覽量
49052 -
ChatGPT
+關注
關注
29文章
1548瀏覽量
7497
原文標題:0x3. 總結
文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論