Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
magicwindyyd
mindspore
提交
380db207
M
mindspore
项目概览
magicwindyyd
/
mindspore
与 Fork 源项目一致
Fork自
MindSpore / mindspore
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
mindspore
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
380db207
编写于
7月 23, 2020
作者:
M
mindspore-ci-bot
提交者:
Gitee
7月 23, 2020
浏览文件
操作
浏览文件
下载
差异文件
!3344 GPU Pad Op
Merge pull request !3344 from danishnxt/PR-GPU-Pad
上级
0874b876
adf59d2d
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
152 addition
and
0 deletion
+152
-0
mindspore/ccsrc/backend/kernel_compiler/gpu/nn/pad_gpu_kernel.cc
...re/ccsrc/backend/kernel_compiler/gpu/nn/pad_gpu_kernel.cc
+26
-0
mindspore/ccsrc/backend/kernel_compiler/gpu/nn/pad_gpu_kernel.h
...ore/ccsrc/backend/kernel_compiler/gpu/nn/pad_gpu_kernel.h
+126
-0
未找到文件。
mindspore/ccsrc/backend/kernel_compiler/gpu/nn/pad_gpu_kernel.cc
0 → 100644
浏览文件 @
380db207
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "backend/kernel_compiler/gpu/nn/pad_gpu_kernel.h"
namespace
mindspore
{
namespace
kernel
{
MS_REG_GPU_KERNEL_ONE
(
Pad
,
KernelAttr
().
AddInputAttr
(
kNumberTypeFloat32
).
AddOutputAttr
(
kNumberTypeFloat32
),
PadGpuFwdKernel
,
float
)
MS_REG_GPU_KERNEL_ONE
(
Pad
,
KernelAttr
().
AddInputAttr
(
kNumberTypeFloat16
).
AddOutputAttr
(
kNumberTypeFloat16
),
PadGpuFwdKernel
,
half
)
}
// namespace kernel
}
// namespace mindspore
mindspore/ccsrc/backend/kernel_compiler/gpu/nn/pad_gpu_kernel.h
0 → 100644
浏览文件 @
380db207
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MINDSPORE_CCSRC_BACKEND_KERNEL_COMPILER_GPU_NN_PAD_GPU_FWD_KERNEL_H_
#define MINDSPORE_CCSRC_BACKEND_KERNEL_COMPILER_GPU_NN_PAD_GPU_FWD_KERNEL_H_
#include <iostream>
#include <vector>
#include "backend/kernel_compiler/gpu/gpu_kernel.h"
#include "backend/kernel_compiler/gpu/gpu_kernel_factory.h"
#include "backend/kernel_compiler/gpu/cuda_impl/pad_impl.cuh"
namespace
mindspore
{
namespace
kernel
{
template
<
typename
T
>
class
PadGpuFwdKernel
:
public
GpuKernel
{
public:
PadGpuFwdKernel
()
:
shape_size_
(
0
),
temp
(
0
),
input_size_
(
0
),
output_size_
(
0
),
workspace_size_
(
0
)
{}
~
PadGpuFwdKernel
()
override
=
default
;
const
std
::
vector
<
size_t
>
&
GetInputSizeList
()
const
override
{
return
input_size_list_
;
}
const
std
::
vector
<
size_t
>
&
GetOutputSizeList
()
const
override
{
return
output_size_list_
;
}
const
std
::
vector
<
size_t
>
&
GetWorkspaceSizeList
()
const
override
{
return
workspace_size_list_
;
}
bool
Launch
(
const
std
::
vector
<
AddressPtr
>
&
inputs
,
const
std
::
vector
<
AddressPtr
>
&
workspace
,
const
std
::
vector
<
AddressPtr
>
&
outputs
,
void
*
stream_ptr
)
override
{
T
*
input
=
GetDeviceAddress
<
T
>
(
inputs
,
0
);
T
*
output
=
GetDeviceAddress
<
T
>
(
outputs
,
0
);
size_t
size
=
output_size_
/
sizeof
(
T
);
int
pad_left
=
paddings
[
3
][
0
];
int
pad_top
=
paddings
[
2
][
0
];
T
pad_value
=
0.0
;
CalPad
(
size
,
input
,
input_shape_
[
0
],
input_shape_
[
1
],
input_shape_
[
2
],
input_shape_
[
3
],
output_shape_
[
2
],
output_shape_
[
3
],
pad_top
,
pad_left
,
pad_value
,
output
,
reinterpret_cast
<
cudaStream_t
>
(
stream_ptr
));
return
true
;
}
bool
Init
(
const
CNodePtr
&
kernel_node
)
override
{
// check number of inputs -> should be 1
size_t
input_num
=
AnfAlgo
::
GetInputTensorNum
(
kernel_node
);
if
(
input_num
!=
1
)
{
MS_LOG
(
ERROR
)
<<
"Input number is "
<<
input_num
<<
", but Pad needs 1 input."
;
return
false
;
}
// check number of output -> should be 1
size_t
output_num
=
AnfAlgo
::
GetOutputTensorNum
(
kernel_node
);
if
(
output_num
!=
1
)
{
MS_LOG
(
ERROR
)
<<
"Output number is "
<<
output_num
<<
", but Pad needs 1 output."
;
return
false
;
}
auto
input_shape
=
AnfAlgo
::
GetPrevNodeOutputInferShape
(
kernel_node
,
0
);
shape_size_
=
input_shape
.
size
();
// shape adjustement -> from 2d/3d to 4d to standardize
if
(
shape_size_
==
4
)
{
}
else
if
(
shape_size_
==
3
)
{
auto
it
=
input_shape
.
begin
();
input_shape
.
insert
(
it
,
1
);
// batch padding
shape_size_
=
4
;
}
else
if
(
shape_size_
==
2
)
{
auto
it
=
input_shape
.
begin
();
input_shape
.
insert
(
it
,
2
,
1
);
// channel padding
shape_size_
=
4
;
}
paddings
=
GetValue
<
std
::
vector
<
std
::
vector
<
int
>>>
(
AnfAlgo
::
GetCNodePrimitive
(
kernel_node
)
->
GetAttr
(
"paddings"
));
// shape adjustement -> from 2d/3d to 4d to standardize
if
(
paddings
.
size
()
==
4
)
{
}
else
if
(
paddings
.
size
()
==
3
)
{
auto
it
=
paddings
.
begin
();
paddings
.
insert
(
it
,
1
,
{
0
,
0
});
// batch padding
}
else
if
(
paddings
.
size
()
==
2
)
{
auto
it
=
paddings
.
begin
();
paddings
.
insert
(
it
,
2
,
{
0
,
0
});
// channel padding
}
input_size_
=
1
;
for
(
size_t
i
=
0
;
i
<
shape_size_
;
i
++
)
{
input_size_
*=
input_shape
[
i
];
input_shape_
.
push_back
(
input_shape
[
i
]);
}
input_size_
*=
sizeof
(
T
);
output_size_
=
1
;
for
(
size_t
i
=
0
;
i
<
shape_size_
;
i
++
)
{
temp
=
input_shape
[
i
]
+
(
paddings
[
i
][
0
]
+
paddings
[
i
][
1
]);
// compute new dim size
output_size_
*=
temp
;
output_shape_
.
push_back
(
temp
);
// correct new dimension size
}
output_size_
*=
sizeof
(
T
);
InitSizeLists
();
return
true
;
}
protected:
void
InitSizeLists
()
override
{
input_size_list_
.
push_back
(
input_size_
);
output_size_list_
.
push_back
(
output_size_
);
}
private:
size_t
shape_size_
;
size_t
temp
;
std
::
vector
<
std
::
vector
<
int
>>
paddings
;
// list of paddings (tuple of tuple in python)
std
::
vector
<
int
>
input_shape_
;
// dims of the input data
std
::
vector
<
int
>
output_shape_
;
// dims of the output data
// default
size_t
input_size_
;
size_t
output_size_
;
size_t
workspace_size_
;
std
::
vector
<
size_t
>
input_size_list_
;
std
::
vector
<
size_t
>
output_size_list_
;
std
::
vector
<
size_t
>
workspace_size_list_
;
};
}
// namespace kernel
}
// namespace mindspore
#endif // MINDSPORE_CCSRC_BACKEND_KERNEL_COMPILER_GPU_NN_PAD_GPU_FWD_KERNEL_H_
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录