Skip to content

Commit 7fc89af

Browse files
authored
[SYCLomatic] Enable partial migration support for cudaEventRecordWithFlags (#2827)
Signed-off-by: chenwei.sun <chenwei.sun@intel.com>
1 parent 477dd77 commit 7fc89af

File tree

4 files changed

+102
-9
lines changed

4 files changed

+102
-9
lines changed

clang/lib/DPCT/RulesLang/RulesLang.cpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2695,12 +2695,12 @@ void FunctionCallRule::runRule(const MatchFinder::MatchResult &Result) {
26952695
EventAPICallRule *EventAPICallRule::CurrentRule = nullptr;
26962696
void EventAPICallRule::registerMatcher(MatchFinder &MF) {
26972697
auto eventAPIName = [&]() {
2698-
return hasAnyName(
2699-
"cudaEventCreate", "cudaEventCreateWithFlags", "cudaEventDestroy",
2700-
"cudaEventRecord", "cudaEventElapsedTime", "cudaEventSynchronize",
2701-
"cudaEventQuery", "cuEventCreate", "cuEventRecord",
2702-
"cuEventSynchronize", "cuEventQuery", "cuEventElapsedTime",
2703-
"cuEventDestroy_v2");
2698+
return hasAnyName("cudaEventCreate", "cudaEventCreateWithFlags",
2699+
"cudaEventDestroy", "cudaEventRecord",
2700+
"cudaEventRecordWithFlags", "cudaEventElapsedTime",
2701+
"cudaEventSynchronize", "cudaEventQuery", "cuEventCreate",
2702+
"cuEventRecord", "cuEventSynchronize", "cuEventQuery",
2703+
"cuEventElapsedTime", "cuEventDestroy_v2");
27042704
};
27052705

27062706
MF.addMatcher(
@@ -3095,7 +3095,8 @@ void EventAPICallRule::runRule(const MatchFinder::MatchResult &Result) {
30953095
}
30963096
std::string ReplStr = MapNames::getDpctNamespace() + "sycl_event_query";
30973097
emplaceTransformation(new ReplaceCalleeName(CE, std::move(ReplStr)));
3098-
} else if (FuncName == "cudaEventRecord" || FuncName == "cuEventRecord") {
3098+
} else if (FuncName == "cudaEventRecord" || FuncName == "cuEventRecord" ||
3099+
FuncName == "cudaEventRecordWithFlags") {
30993100
handleEventRecord(CE, Result, IsAssigned);
31003101
} else if (FuncName == "cudaEventElapsedTime" ||
31013102
FuncName == "cuEventElapsedTime") {
@@ -3260,7 +3261,22 @@ void EventAPICallRule::findEventAPI(const Stmt *Node, const CallExpr *&Call,
32603261
void EventAPICallRule::handleEventRecordWithProfilingEnabled(
32613262
const CallExpr *CE, const MatchFinder::MatchResult &Result,
32623263
bool IsAssigned) {
3263-
auto StreamArg = CE->getArg(CE->getNumArgs() - 1);
3264+
int NumArgs = CE->getNumArgs();
3265+
const Expr *StreamArg = CE->getArg(NumArgs - 1);
3266+
if (NumArgs == 3) { // Special process for cudaEventRecordWithFlags().
3267+
StreamArg = CE->getArg(1);
3268+
auto APIName = CE->getDirectCallee()->getNameInfo().getName().getAsString();
3269+
const Expr *SecArg = CE->getArg(2);
3270+
ExprAnalysis Arg2EA(SecArg);
3271+
auto Arg2Name = Arg2EA.getReplacedString();
3272+
if (Arg2Name != "cudaEventRecordDefault") {
3273+
report(CE->getBeginLoc(), Diagnostics::NOT_SUPPORTED_PARAMETER, false,
3274+
APIName, "parameter " + Arg2Name + " is unsupported");
3275+
return;
3276+
}
3277+
emplaceTransformation(removeArg(CE, 2, *Result.SourceManager));
3278+
}
3279+
32643280
auto EventArg = CE->getArg(0);
32653281
ExprAnalysis StreamEA(StreamArg);
32663282
ExprAnalysis Arg0EA(EventArg);

clang/lib/DPCT/SrcAPI/APINames.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ ENTRY(cudaEventDestroy, cudaEventDestroy, true, API_CALL_REMOVED, P0, "DPCT1026/
122122
ENTRY(cudaEventElapsedTime, cudaEventElapsedTime, true, NO_FLAG, P0, "DPCT1012")
123123
ENTRY(cudaEventQuery, cudaEventQuery, true, NO_FLAG, P0, "Successful")
124124
ENTRY(cudaEventRecord, cudaEventRecord, true, NO_FLAG, P0, "DPCT1012/DPCT1024")
125-
ENTRY(cudaEventRecordWithFlags, cudaEventRecordWithFlags, false, NO_FLAG, P7, "comment")
125+
ENTRY(cudaEventRecordWithFlags, cudaEventRecordWithFlags, true, NO_FLAG, P7, "DPCT1028")
126126
ENTRY(cudaEventSynchronize, cudaEventSynchronize, true, NO_FLAG, P0, "DPCT1012")
127127

128128
// external resource interoperability functions of runtime API
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// UNSUPPORTED: cuda-8.0, cuda-9.0, cuda-9.1, cuda-9.2, cuda-10.0, cuda-10.1, cuda-10.2, cuda-11.0
2+
// UNSUPPORTED: v8.0, v9.0, v9.1, v9.2, v10.0, v10.1, v10.2, v11.0
3+
4+
// RUN:dpct --enable-profiling --no-dpcpp-extensions=enqueued_barriers --format-range=none -out-root %T/event_record_with_flags_no_qb %s --cuda-include-path="%cuda-path/include" --sycl-named-lambda -- -std=c++14 -x cuda --cuda-host-only
5+
// RUN: FileCheck --input-file %T/event_record_with_flags_no_qb/event_record_with_flags_no_qb.dp.cpp --match-full-lines %s
6+
// RUN: %if build_lit %{icpx -c -fsycl -DNO_BUILD_TEST %T/event_record_with_flags_no_qb/event_record_with_flags_no_qb.dp.cpp -o %T/event_record_with_flags_no_qb/event_record_with_flags_no_qb.dp.o %}
7+
8+
9+
// CHECK:#define DPCT_PROFILING_ENABLED
10+
// CHECK-NEXT:#include <sycl/sycl.hpp>
11+
// CHECK-NEXT:#include <dpct/dpct.hpp>
12+
#include <cuda_runtime.h>
13+
14+
// CHECK: void cudaEventRecordWithFlags_1() {
15+
// CHECK-NEXT: dpct::event_ptr start;
16+
// CHECK-NEXT: dpct::queue_ptr stream;
17+
// CHECK-NEXT: *start = stream->single_task([=](){});
18+
// CHECK-NEXT: }
19+
void cudaEventRecordWithFlags_1() {
20+
cudaEvent_t start;
21+
cudaStream_t stream;
22+
cudaEventRecordWithFlags(start, stream, cudaEventRecordDefault);
23+
}
24+
25+
#ifndef NO_BUILD_TEST
26+
// CHECK: void cudaEventRecordWithFlags_2() {
27+
// CHECK-NEXT: dpct::event_ptr start;
28+
// CHECK-NEXT: dpct::queue_ptr stream;
29+
// CHECK-NEXT: /*
30+
// CHECK-NEXT: DPCT1028:{{[0-9a-f]+}}: The cudaEventRecordWithFlags was not migrated because parameter cudaEventRecordExternal is unsupported.
31+
// CHECK-NEXT: */
32+
// CHECK-NEXT: cudaEventRecordWithFlags(start, stream, cudaEventRecordExternal);
33+
// CHECK-NEXT: }
34+
void cudaEventRecordWithFlags_2() {
35+
cudaEvent_t start;
36+
cudaStream_t stream;
37+
cudaEventRecordWithFlags(start, stream, cudaEventRecordExternal);
38+
}
39+
#endif
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// UNSUPPORTED: cuda-8.0, cuda-9.0, cuda-9.1, cuda-9.2, cuda-10.0, cuda-10.1, cuda-10.2, cuda-11.0
2+
// UNSUPPORTED: v8.0, v9.0, v9.1, v9.2, v10.0, v10.1, v10.2, v11.0
3+
4+
// RUN: dpct --enable-profiling --format-range=none -out-root %T/event_record_with_flags_qb %s --cuda-include-path="%cuda-path/include" --sycl-named-lambda -- -std=c++14 -x cuda --cuda-host-only
5+
// RUN: FileCheck --input-file %T/event_record_with_flags_qb/event_record_with_flags_qb.dp.cpp --match-full-lines %s
6+
// RUN: %if build_lit %{icpx -c -fsycl -DNO_BUILD_TEST %T/event_record_with_flags_qb/event_record_with_flags_qb.dp.cpp -o %T/event_record_with_flags_qb/event_record_with_flags_qb.dp.o %}
7+
8+
// CHECK:#define DPCT_PROFILING_ENABLED
9+
// CHECK-NEXT:#include <sycl/sycl.hpp>
10+
// CHECK-NEXT:#include <dpct/dpct.hpp>
11+
#include <cuda_runtime.h>
12+
13+
// CHECK: void cudaEventRecordWithFlags_1() {
14+
// CHECK-NEXT: dpct::event_ptr start;
15+
// CHECK-NEXT: dpct::queue_ptr stream;
16+
// CHECK-NEXT: dpct::sync_barrier(start, stream);
17+
// CHECK-NEXT: }
18+
void cudaEventRecordWithFlags_1() {
19+
cudaEvent_t start;
20+
cudaStream_t stream;
21+
cudaEventRecordWithFlags(start, stream, cudaEventRecordDefault);
22+
}
23+
24+
#ifndef NO_BUILD_TEST
25+
// CHECK: void cudaEventRecordWithFlags_2() {
26+
// CHECK-NEXT: dpct::event_ptr start;
27+
// CHECK-NEXT: dpct::queue_ptr stream;
28+
// CHECK-NEXT: /*
29+
// CHECK-NEXT: DPCT1028:{{[0-9a-f]+}}: The cudaEventRecordWithFlags was not migrated because parameter cudaEventRecordExternal is unsupported.
30+
// CHECK-NEXT: */
31+
// CHECK-NEXT: cudaEventRecordWithFlags(start, stream, cudaEventRecordExternal);
32+
// CHECK-NEXT:}
33+
void cudaEventRecordWithFlags_2() {
34+
cudaEvent_t start;
35+
cudaStream_t stream;
36+
cudaEventRecordWithFlags(start, stream, cudaEventRecordExternal);
37+
}
38+
#endif

0 commit comments

Comments
 (0)