mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 15:53:03 +04:00
Merge pull request #27006 from hanliutong:rvv-fix-ui-1024
Fix issues in RISC-V Vector (RVV) Universal Intrinsic #27006 This PR aims to make `opencv_test_core` pass on RVV, via following two parts: 1. Fix bug in Universal Intrinsic when VLEN >= 512: - `max_nlanes` should be multiplied by 2, because we use LMUL=2 in RVV Universal Intrinsic since #26318. - Related tests are also expanded to match longer registers - Relax the precision threshold of `v_erf` to make the tests pass 2. Temporary fix #26936 - Disable 3 Universal Intrinsic code blocks on GCC - This is just a temporary fix until we figure out if it's our issue or GCC/something else's This patch is tested under the following conditions: - Compier: GCC 14.2, Clang 19.1.7 - Device: Muse-Pi (VLEN=256), QEMU (VLEN=512, 1024) ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [ ] The PR is proposed to the proper branch - [ ] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake
This commit is contained in:
@@ -108,7 +108,8 @@ cvt_( const _Ts* src, size_t sstep, _Td* dst, size_t dstep, Size size )
|
||||
for( int i = 0; i < size.height; i++, src += sstep, dst += dstep )
|
||||
{
|
||||
int j = 0;
|
||||
#if (CV_SIMD || CV_SIMD_SCALABLE)
|
||||
// Excluding GNU in CV_SIMD_SCALABLE because of "opencv/issues/26936"
|
||||
#if (CV_SIMD || (CV_SIMD_SCALABLE && !(defined(__GNUC__) && !defined(__clang__))) )
|
||||
const int VECSZ = VTraits<_Twvec>::vlanes()*2;
|
||||
for( ; j < size.width; j += VECSZ )
|
||||
{
|
||||
|
||||
@@ -92,7 +92,7 @@ template<typename _Ts, typename _Td> inline void
|
||||
cvt_32f( const _Ts* src, size_t sstep, _Td* dst, size_t dstep,
|
||||
Size size, float a, float b )
|
||||
{
|
||||
#if (CV_SIMD || CV_SIMD_SCALABLE)
|
||||
#if (CV_SIMD || (CV_SIMD_SCALABLE && !(defined(__GNUC__) && !defined(__clang__))) )
|
||||
v_float32 va = vx_setall_f32(a), vb = vx_setall_f32(b);
|
||||
const int VECSZ = VTraits<v_float32>::vlanes()*2;
|
||||
#endif
|
||||
@@ -102,7 +102,8 @@ cvt_32f( const _Ts* src, size_t sstep, _Td* dst, size_t dstep,
|
||||
for( int i = 0; i < size.height; i++, src += sstep, dst += dstep )
|
||||
{
|
||||
int j = 0;
|
||||
#if (CV_SIMD || CV_SIMD_SCALABLE)
|
||||
// Excluding GNU in CV_SIMD_SCALABLE because of "opencv/issues/26936"
|
||||
#if (CV_SIMD || (CV_SIMD_SCALABLE && !(defined(__GNUC__) && !defined(__clang__))) )
|
||||
for( ; j < size.width; j += VECSZ )
|
||||
{
|
||||
if( j > size.width - VECSZ )
|
||||
@@ -163,7 +164,7 @@ template<typename _Ts, typename _Td> inline void
|
||||
cvt_64f( const _Ts* src, size_t sstep, _Td* dst, size_t dstep,
|
||||
Size size, double a, double b )
|
||||
{
|
||||
#if (CV_SIMD_64F || CV_SIMD_SCALABLE_64F)
|
||||
#if (CV_SIMD_64F || (CV_SIMD_SCALABLE_64F && !(defined(__GNUC__) && !defined(__clang__))) )
|
||||
v_float64 va = vx_setall_f64(a), vb = vx_setall_f64(b);
|
||||
const int VECSZ = VTraits<v_float64>::vlanes()*2;
|
||||
#endif
|
||||
@@ -173,7 +174,8 @@ cvt_64f( const _Ts* src, size_t sstep, _Td* dst, size_t dstep,
|
||||
for( int i = 0; i < size.height; i++, src += sstep, dst += dstep )
|
||||
{
|
||||
int j = 0;
|
||||
#if (CV_SIMD_64F || CV_SIMD_SCALABLE_64F)
|
||||
// Excluding GNU in CV_SIMD_SCALABLE because of "opencv/issues/26936"
|
||||
#if (CV_SIMD_64F || (CV_SIMD_SCALABLE_64F && !(defined(__GNUC__) && !defined(__clang__))) )
|
||||
for( ; j < size.width; j += VECSZ )
|
||||
{
|
||||
if( j > size.width - VECSZ )
|
||||
|
||||
Reference in New Issue
Block a user