关于stylegan3第一次运行编译filtered_lrelu_plugin出错的问题

报错如下:

filtered_lrelu.cpp(147): error C4984: 'if constexpr' is a C++17 language extension

原因是我用的Visual studio 2017里的编译器好像是C++14的标准,但是这个语句是C++17的。自动学完C++就再也没碰过,所以只能摸索着整。尝试装了2022版本的VS,但是CUDA 11.1编译只支持2017和2019的,官方给的installer里又没有2019。后来在stylegan3的官方库里找到一个issue是有大哥碰到了这个问题并解决了:
https://github.com/NVlabs/stylegan3/issues/38

在这里记录一下解决的方法:
(1) 在/torch_utils/ops/filtered_lrelu.h里加入

template < typename T >
struct ScalarTypeLessThan4 {
using type = T;
};

template <>
struct ScalarTypeLessThan4 < double > {
using type = float;
};

(2) 在/torch_utils/ops/filtered_lrelu.cpp中,把大概157行的这一段,也就是出问题的地方

        if constexpr (sizeof(scalar_t) <= 4) // Exclude doubles. constexpr prevents template instantiation.
        
        {
            using scalar_t_l4 = ScalarTypeLessThan4<scalar_t>::type;
            // Choose kernel based on index type, datatype and sign read/write modes.
            if      (!index64b &&  writeSigns && !readSigns) spec = choose_filtered_lrelu_kernel<scalar_t, int32_t, true,  false>(p, sharedKB);
            else if (!index64b && !writeSigns &&  readSigns) spec = choose_filtered_lrelu_kernel<scalar_t, int32_t, false, true >(p, sharedKB);
            else if (!index64b && !writeSigns && !readSigns) spec = choose_filtered_lrelu_kernel<scalar_t, int32_t, false, false>(p, sharedKB);
            else if ( index64b &&  writeSigns && !readSigns) spec = choose_filtered_lrelu_kernel<scalar_t, int64_t, true,  false>(p, sharedKB);
            else if ( index64b && !writeSigns &&  readSigns) spec = choose_filtered_lrelu_kernel<scalar_t, int64_t, false, true >(p, sharedKB);
            else if ( index64b && !writeSigns && !readSigns) spec = choose_filtered_lrelu_kernel<scalar_t, int64_t, false, false>(p, sharedKB);
        }

替换为:

        if /*constexpr*/ (sizeof(scalar_t) <= 4) // Exclude doubles. constexpr prevents template instantiation.
        {
            using scalar_t_l4 = ScalarTypeLessThan4<scalar_t>::type;

            // Choose kernel based on index type, datatype and sign read/write modes.
            if      (!index64b &&  writeSigns && !readSigns) spec = choose_filtered_lrelu_kernel<scalar_t_l4, int32_t, true,  false>(p, sharedKB);
            else if (!index64b && !writeSigns &&  readSigns) spec = choose_filtered_lrelu_kernel<scalar_t_l4, int32_t, false, true >(p, sharedKB);
            else if (!index64b && !writeSigns && !readSigns) spec = choose_filtered_lrelu_kernel<scalar_t_l4, int32_t, false, false>(p, sharedKB);
            else if ( index64b &&  writeSigns && !readSigns) spec = choose_filtered_lrelu_kernel<scalar_t_l4, int64_t, true,  false>(p, sharedKB);
            else if ( index64b && !writeSigns &&  readSigns) spec = choose_filtered_lrelu_kernel<scalar_t_l4, int64_t, false, true >(p, sharedKB);
            else if ( index64b && !writeSigns && !readSigns) spec = choose_filtered_lrelu_kernel<scalar_t_l4, int64_t, false, false>(p, sharedKB);
        }

然后就可以顺利运行啦!
附一张生成的图
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值