78 lines
2.7 KiB
Python
78 lines
2.7 KiB
Python
# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved.
|
|
#
|
|
# 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.
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
from site import getsitepackages
|
|
|
|
import numpy as np
|
|
|
|
from paddle.utils.cpp_extension.extension_utils import (
|
|
IS_WINDOWS,
|
|
_get_all_paddle_includes_from_include_root,
|
|
)
|
|
|
|
IS_MAC = sys.platform.startswith('darwin')
|
|
|
|
# Note(Aurelius84): We use `add_test` in Cmake to config how to run unittest in CI.
|
|
# `PYTHONPATH` will be set as `build/python/paddle` that will make no way to find
|
|
# paddle include directory. Because the following path is generated after installing
|
|
# PaddlePaddle whl. So here we specific `include_dirs` to avoid errors in CI.
|
|
paddle_includes = []
|
|
for site_packages_path in getsitepackages():
|
|
paddle_include_dir = Path(site_packages_path) / "paddle/include"
|
|
paddle_includes.extend(
|
|
_get_all_paddle_includes_from_include_root(str(paddle_include_dir))
|
|
)
|
|
|
|
|
|
# Test for extra compile args
|
|
extra_cc_args = ['-w', '-g'] if not IS_WINDOWS else ['/w']
|
|
extra_nvcc_args = ['-O3']
|
|
extra_compile_args = {'cc': extra_cc_args, 'nvcc': extra_nvcc_args}
|
|
|
|
|
|
def check_output(out, pd_out, name):
|
|
if out is None and pd_out is None:
|
|
return
|
|
assert out is not None, "out value of " + name + " is None"
|
|
assert pd_out is not None, "pd_out value of " + name + " is None"
|
|
if isinstance(out, list) and isinstance(pd_out, list):
|
|
for idx in range(len(out)):
|
|
np.testing.assert_array_equal(
|
|
out[idx],
|
|
pd_out[idx],
|
|
err_msg=f'custom op {name}: {out[idx]},\n paddle api {name}: {pd_out[idx]}',
|
|
)
|
|
else:
|
|
np.testing.assert_array_equal(
|
|
out,
|
|
pd_out,
|
|
err_msg=f'custom op {name}: {out},\n paddle api {name}: {pd_out}',
|
|
)
|
|
|
|
|
|
def check_output_allclose(out, pd_out, name, rtol=5e-5, atol=1e-2):
|
|
if out is None and pd_out is None:
|
|
return
|
|
assert out is not None, "out value of " + name + " is None"
|
|
assert pd_out is not None, "pd_out value of " + name + " is None"
|
|
np.testing.assert_allclose(
|
|
out,
|
|
pd_out,
|
|
rtol,
|
|
atol,
|
|
err_msg=f'custom op {name}: {out},\n paddle api {name}: {pd_out}',
|
|
)
|