Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
19eefef4
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
19eefef4
编写于
4月 27, 2021
作者:
X
XiangGao
提交者:
GitHub
4月 27, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Check for cuda errors immediately after kernel launch (#32557)
Co-authored-by:
N
Yang Zhang
<
yangzhang@live.com
>
上级
c1db7e32
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
30 addition
and
3 deletion
+30
-3
paddle/fluid/framework/op_registry.h
paddle/fluid/framework/op_registry.h
+20
-3
paddle/fluid/platform/enforce.h
paddle/fluid/platform/enforce.h
+10
-0
未找到文件。
paddle/fluid/framework/op_registry.h
浏览文件 @
19eefef4
...
@@ -134,6 +134,17 @@ class OpRegistry {
...
@@ -134,6 +134,17 @@ class OpRegistry {
static
std
::
unique_ptr
<
OperatorBase
>
CreateOp
(
const
OpDesc
&
op_desc
);
static
std
::
unique_ptr
<
OperatorBase
>
CreateOp
(
const
OpDesc
&
op_desc
);
};
};
template
<
typename
PlaceType
>
inline
void
CheckKernelLaunch
(
const
char
*
op_type
){};
#ifdef PADDLE_WITH_CUDA
template
<
>
inline
void
CheckKernelLaunch
<::
paddle
::
platform
::
CUDAPlace
>
(
const
char
*
op_type
)
{
PADDLE_ENFORCE_CUDA_LAUNCH_SUCCESS
(
op_type
);
};
#endif
template
<
typename
PlaceType
,
bool
at_end
,
size_t
I
,
typename
...
KernelType
>
template
<
typename
PlaceType
,
bool
at_end
,
size_t
I
,
typename
...
KernelType
>
struct
OpKernelRegistrarFunctor
;
struct
OpKernelRegistrarFunctor
;
...
@@ -162,8 +173,9 @@ struct OpKernelRegistrarFunctor<PlaceType, false, I, KernelTypes...> {
...
@@ -162,8 +173,9 @@ struct OpKernelRegistrarFunctor<PlaceType, false, I, KernelTypes...> {
RegisterKernelClass
<
PlaceType
,
T
>
(
RegisterKernelClass
<
PlaceType
,
T
>
(
op_type
,
library_type
,
customized_type_value
,
op_type
,
library_type
,
customized_type_value
,
[](
const
framework
::
ExecutionContext
&
ctx
)
{
[
op_type
](
const
framework
::
ExecutionContext
&
ctx
)
{
KERNEL_TYPE
().
Compute
(
ctx
);
KERNEL_TYPE
().
Compute
(
ctx
);
CheckKernelLaunch
<
PlaceType
>
(
op_type
);
});
});
constexpr
auto
size
=
std
::
tuple_size
<
std
::
tuple
<
KernelTypes
...
>>::
value
;
constexpr
auto
size
=
std
::
tuple_size
<
std
::
tuple
<
KernelTypes
...
>>::
value
;
OpKernelRegistrarFunctor
<
PlaceType
,
I
+
1
==
size
,
I
+
1
,
KernelTypes
...
>
OpKernelRegistrarFunctor
<
PlaceType
,
I
+
1
==
size
,
I
+
1
,
KernelTypes
...
>
...
@@ -223,8 +235,13 @@ struct OpKernelRegistrarFunctorEx<PlaceType, false, I,
...
@@ -223,8 +235,13 @@ struct OpKernelRegistrarFunctorEx<PlaceType, false, I,
void
operator
()(
const
char
*
op_type
,
const
char
*
library_type
,
void
operator
()(
const
char
*
op_type
,
const
char
*
library_type
,
int
customized_type_value
)
const
{
int
customized_type_value
)
const
{
RegisterKernelClass
<
PlaceType
,
T
>
(
op_type
,
library_type
,
RegisterKernelClass
<
PlaceType
,
T
>
(
customized_type_value
,
Functor
());
op_type
,
library_type
,
customized_type_value
,
[
op_type
](
const
framework
::
ExecutionContext
&
ctx
)
{
Functor
()(
ctx
);
CheckKernelLaunch
<
PlaceType
>
(
op_type
);
});
constexpr
auto
size
=
constexpr
auto
size
=
std
::
tuple_size
<
std
::
tuple
<
DataTypeAndKernelType
...
>>::
value
;
std
::
tuple_size
<
std
::
tuple
<
DataTypeAndKernelType
...
>>::
value
;
...
...
paddle/fluid/platform/enforce.h
浏览文件 @
19eefef4
...
@@ -991,6 +991,16 @@ DEFINE_CUDA_STATUS_TYPE(ncclResult_t, ncclSuccess);
...
@@ -991,6 +991,16 @@ DEFINE_CUDA_STATUS_TYPE(ncclResult_t, ncclSuccess);
} \
} \
} while (0)
} while (0)
#define PADDLE_ENFORCE_CUDA_LAUNCH_SUCCESS(OP) \
do { \
auto res = cudaGetLastError(); \
if (UNLIKELY(res != cudaSuccess)) { \
auto msg = ::paddle::platform::build_nvidia_error_msg(res); \
PADDLE_THROW(platform::errors::Fatal("CUDA error after kernel (%s): %s", \
OP, msg)); \
} \
} while (0)
inline
void
retry_sleep
(
unsigned
milliseconds
)
{
inline
void
retry_sleep
(
unsigned
milliseconds
)
{
#ifdef _WIN32
#ifdef _WIN32
Sleep
(
milliseconds
);
Sleep
(
milliseconds
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录