Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

'J': is not a valid type for non-type template parameter 'J' error in boost\fusion\container\vector\vector.hpp #269

Open
derdotte opened this issue Mar 12, 2023 · 7 comments

Comments

@derdotte
Copy link

I am using Visual Studio 2022 and am currently trying to compile the following code:

#include <iostream>
#include <cmath>

#include <thrust/device_vector.h>
#include <thrust/iterator/permutation_iterator.h>
#include <thrust/iterator/counting_iterator.h>

#include <boost/numeric/odeint/stepper/runge_kutta4.hpp>
#include <boost/numeric/odeint/integrate/integrate_const.hpp>
#include <boost/numeric/odeint/external/thrust/thrust.hpp>

using namespace std;

using namespace boost::numeric::odeint;


//change this to float if your device does not support double computation
typedef double value_type;


//[ thrust_phase_chain_system
//change this to host_vector< ... > if you want to run on CPU
typedef thrust::device_vector< value_type > state_type;
typedef thrust::device_vector< size_t > index_vector_type;
//typedef thrust::host_vector< value_type > state_type;
//typedef thrust::host_vector< size_t > index_vector_type;


class phase_oscillators
{

public:

    struct sys_functor
    {
        template< class Tuple >
        __host__ __device__
            void operator()(Tuple t)  // this functor works on tuples of values
        {
            // first, unpack the tuple into value, neighbors and omega
            const value_type phi = thrust::get<0>(t);
            const value_type phi_left = thrust::get<1>(t);  // left neighbor
            const value_type phi_right = thrust::get<2>(t); // right neighbor
            const value_type omega = thrust::get<3>(t);
            // the dynamical equation
            thrust::get<4>(t) = omega + sin(phi_right - phi) + sin(phi - phi_left);
        }
    };

    phase_oscillators(const state_type& omega)
        : m_omega(omega), m_N(omega.size()), m_prev(omega.size()), m_next(omega.size())
    {
        // build indices pointing to left and right neighbours
        thrust::counting_iterator<size_t> c(0);
        thrust::copy(c, c + m_N - 1, m_prev.begin() + 1);
        m_prev[0] = 0; // m_prev = { 0 , 0 , 1 , 2 , 3 , ... , N-1 }

        thrust::copy(c + 1, c + m_N, m_next.begin());
        m_next[m_N - 1] = m_N - 1; // m_next = { 1 , 2 , 3 , ... , N-1 , N-1 }
    }

    void operator() (const state_type& x, state_type& dxdt, const value_type dt)
    {
        thrust::for_each(
            thrust::make_zip_iterator(
                thrust::make_tuple(
                    x.begin(),
                    thrust::make_permutation_iterator(x.begin(), m_prev.begin()),
                    thrust::make_permutation_iterator(x.begin(), m_next.begin()),
                    m_omega.begin(),
                    dxdt.begin()
                )),
            thrust::make_zip_iterator(
                thrust::make_tuple(
                    x.end(),
                    thrust::make_permutation_iterator(x.begin(), m_prev.end()),
                    thrust::make_permutation_iterator(x.begin(), m_next.end()),
                    m_omega.end(),
                    dxdt.end())),
            sys_functor()
        );
    }

private:

    const state_type& m_omega;
    const size_t m_N;
    index_vector_type m_prev;
    index_vector_type m_next;
};
//]

const size_t N = 32768;
const value_type pi = 3.1415926535897932384626433832795029;
const value_type epsilon = 6.0 / (N * N); // should be < 8/N^2 to see phase locking
const value_type dt = 0.1;

int main(int arc, char* argv[])
{
    //[ thrust_phase_chain_integration
    // create initial conditions and omegas on host:
    vector< value_type > x_host(N);
    vector< value_type > omega_host(N);
    for (size_t i = 0; i < N; ++i)
    {
        x_host[i] = 2.0 * pi * rand();
        omega_host[i] = (N - i) * epsilon; // decreasing frequencies
    }

    // copy to device
    state_type x = x_host;
    state_type omega = omega_host;

    // create stepper
    runge_kutta4< state_type, value_type, state_type, value_type > stepper;

    // create phase oscillator system function
    phase_oscillators sys(omega);

    // integrate
    integrate_const(stepper, sys, x, 0.0, 10.0, dt);

    thrust::copy(x.begin(), x.end(), std::ostream_iterator< value_type >(std::cout, "\n"));
    std::cout << std::endl;
    //]
}

An error occurs upon compilation using VS22 community edition in vector.hpp.

Boost Version: 1.81
Platform: Windows 10 64x

This uses Thrust functionality to calculate a large amount of ODEs.

The error is:

Severity	Code	Description	Project	File	Line	Suppression State
Error	C2993	'J': is not a valid type for non-type template parameter 'J'	Pairproduction	C:\Program Files\Boost\boost_1_81_0\boost\fusion\container\vector\vector.hpp	236	
Error	C2062	type 'unknown-type' unexpected	Pairproduction	C:\Program Files\Boost\boost_1_81_0\boost\fusion\container\vector\vector.hpp	236	
Error	C2334	unexpected token(s) preceding '{'; skipping apparent function body	Pairproduction	C:\Program Files\Boost\boost_1_81_0\boost\fusion\container\vector\vector.hpp	239	
Error	C2993	'J': is not a valid type for non-type template parameter 'J'	Pairproduction	C:\Program Files\Boost\boost_1_81_0\boost\fusion\container\vector\vector.hpp	243	
Error	C4430	missing type specifier - int assumed. Note: C++ does not support default-int	Pairproduction	C:\Program Files\Boost\boost_1_81_0\boost\fusion\container\vector\vector.hpp	243	
Error	C2062	type 'unknown-type' unexpected	Pairproduction	C:\Program Files\Boost\boost_1_81_0\boost\fusion\container\vector\vector.hpp	243	
Error	C2334	unexpected token(s) preceding '{'; skipping apparent function body	Pairproduction	C:\Program Files\Boost\boost_1_81_0\boost\fusion\container\vector\vector.hpp	246	
Error	C2504	'boost::fusion::vector_detail::vector_data<std::integer_sequence<unsigned __int64,0,1,2,3>,boost::numeric::odeint::detail::stage<T,1>,boost::numeric::odeint::detail::stage<T,2>,boost::numeric::odeint::detail::stage<T,3>,boost::numeric::odeint::detail::stage<T,4>>': base class undefined	Pairproduction	C:\Program Files\Boost\boost_1_81_0\boost\fusion\container\vector\vector.hpp	253	
Error	MSB3721	The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\bin\nvcc.exe" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --use-local-env -ccbin "G:\Visual Studio\VC\Tools\MSVC\14.34.31933\bin\HostX64\x64" -x cu   -I"C:\Program Files\Boost\boost_1_81_0" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\include"  -G   --keep-dir x64\Debug  -maxrregcount=0  --machine 64 --compile -cudart static  -g  -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Fdx64\Debug\vc143.pdb /FS /Zi /RTC1 /MDd " -o "C:\Users\danie\OneDrive\Dokumente\schule\studium\7. Semester\Spezialisierung\Spezialisierung_code\Pairproduction\x64\Debug\kernel.cu.obj" "C:\Users\danie\OneDrive\Dokumente\schule\studium\7. Semester\Spezialisierung\Spezialisierung_code\Pairproduction\kernel.cu"" exited with code 2.	Pairproduction	G:\Visual Studio\MSBuild\Microsoft\VC\v170\BuildCustomizations\CUDA 12.0.targets	794

What is wrong and can i fix it on my end?

@mclow mclow transferred this issue from boostorg/boost Mar 12, 2023
@RKGalaxy-Luo
Copy link

I've tried such a method:
correct the code in "boost\fusion\container\vector\vector.hpp"
Tried

private:
template <std::size_t J>
using store_at = decltype(store_at_impl(static_cast<vector_data*>(nullptr)));

public:
template <std::size_t J>
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
typename store_at::elem_type& at_impl(std::integral_constant<std::size_t, J>)
{
return store_at::elem;
}

template <std::size_t J>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
typename store_at<J>::elem_type const& at_impl(std::integral_constant<std::size_t, J>) const
{
    return store_at<J>::elem;
}

};

NOTICE: I don't know whether such a method will have an influence on other libraries

@djowel
Copy link
Collaborator

djowel commented May 11, 2024

If you think this is a fusion issue, please post an MVCE (without any dependencies). I have no expertise on the other dependent libraries.

@lingyuanmoshang
Copy link

Has this issue been solved?

@djowel
Copy link
Collaborator

djowel commented Jul 18, 2024

Has this issue been solved?

Again, please post an MVCE https://stackoverflow.com/help/minimal-reproducible-example

@BennyRod
Copy link

Hello,
I have been facing the same issue then I am going to include a MVCE using a .cu file:

Configurations:
-Microsoft Visual Studio Community 2022 (64-bit) - Current
Version 17.11.0
-Nvidia Driver Version: 560.81
-CUDA Toolkit 12.6
-BOOST 1.86
-MVCE.cu

MVCE.cu:

#include <boost/numeric/odeint.hpp>
int main()
{

}

Output:

  1. Error C2334 unexpected token(s) preceding '{'; skipping apparent function body CudaRuntime1 C:\Users\benny\Downloads\boost_1_86_0\boost\fusion\container\vector\vector.hpp 246

2.Error C2993 'J': is not a valid type for non-type template parameter 'J' CudaRuntime1 C:\Users\benny\Downloads\boost_1_86_0\boost\fusion\container\vector\vector.hpp 236

  1. Error C2062 type 'unknown-type' unexpected CudaRuntime1 C:\Users\benny\Downloads\boost_1_86_0\boost\fusion\container\vector\vector.hpp 236

  2. Error C2334 unexpected token(s) preceding '{'; skipping apparent function body CudaRuntime1 C:\Users\benny\Downloads\boost_1_86_0\boost\fusion\container\vector\vector.hpp 239

5.Error C2993 'J': is not a valid type for non-type template parameter 'J' CudaRuntime1 C:\Users\benny\Downloads\boost_1_86_0\boost\fusion\container\vector\vector.hpp 243

6.Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int CudaRuntime1 C:\Users\benny\Downloads\boost_1_86_0\boost\fusion\container\vector\vector.hpp 243

7.Error C2062 type 'unknown-type' unexpected CudaRuntime1 C:\Users\benny\Downloads\boost_1_86_0\boost\fusion\container\vector\vector.hpp 243

The first error refers to the use of a C++ version prior to C++ 20 but I have used C++ 20 and it is the same error.

On the other hand, if it is replaced odeint by interval then the code compiles properly.

#include <boost/numeric/odeint.hpp>
int main()
{

}

Output:
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
========== Build completed at 11:07 AM and took 01.917 seconds ==========

Finally, this code works properly in Ubuntu using CMake then it is not a general incompatibility between CUDA and BOOST. I hope you can help us with this issue. Thank you so much in advance! Let me know if there is something I can do to help you to fix this error.

@djowel
Copy link
Collaborator

djowel commented Aug 15, 2024

#include <boost/numeric/odeint.hpp>

This is not directly a Boost.Fusion issue, and should probably be redirected to Boost.Numeric.Odeint instead.

@BennyRod
Copy link

BennyRod commented Aug 23, 2024

Hello:
On Windows 11, I have found that if you comment out these lines from vector.hpp the code works properly. In my case, I am using the Boost library in the host then I do not need anything in the device. Definitely, there are some differences in how vector.hpp is treated on Windows and Ubuntu.

Captura de pantalla 2024-08-22 185436

Code using C++ compiler:


#include <boost/numeric/odeint.hpp>
#include <iostream>
#include <vector>

using namespace boost::numeric::odeint;

std::vector<std::vector<double>> variable;
std::vector<double> times;

void system_of_equations(const std::vector<double>& variables,
	std::vector<double>& derivative_rates, const double time)
{
	derivative_rates[0] = variables[0] + variables[1];
	derivative_rates[1] = variables[0] - variables[1];
}

void printVariables(const std::vector<double>& variables, const double time)
{
	std::cout << "t=" << time << "   "
		<< "x=" << variables[0] << "   "
		<< "y=" << variables[1] << std::endl;

	variable.push_back(variables);
	times.push_back(time);
}

int main()
{
	std::vector<double> initial_variables = { 1.0, 0.0 }; 

	double start_time = 0.0, end_time = 5,
		time_step = 1e-4; 
	integrate(system_of_equations, initial_variables, start_time, end_time, time_step, printVariables);

	return 0;
}

Output:

t=0   x=1   y=0
t=0.0001   x=1.0001   y=0.0001
t=0.00055   x=1.00055   y=0.00055
t=0.002575   x=1.00258   y=0.00257501
t=0.0116875   x=1.01182   y=0.011688
t=0.0526938   x=1.05552   y=0.0527425
t=0.23332   x=1.29251   y=0.237577
t=0.413945   x=1.6143   y=0.437997
t=0.605022   x=2.07053   y=0.681595
t=0.796099   x=2.67888   y=0.975267
t=0.987176   x=3.48403   y=1.34059
t=1.17825   x=4.54515   y=1.8044
t=1.36933   x=5.94017   y=2.40077
t=1.56041   x=7.7716   y=3.17352
t=1.75148   x=10.174   y=4.17941
t=1.94256   x=13.3238   y=5.49234
t=2.13364   x=17.4525   y=7.20878
t=2.32471   x=22.8633   y=9.45482
t=2.51579   x=29.9538   y=12.3955
t=2.70687   x=39.2449   y=16.2468
t=2.89794   x=51.4192   y=21.2916
t=3.08902   x=67.371   y=27.9007
t=3.2801   x=88.2723   y=36.5596
t=3.47117   x=115.659   y=47.9043
t=3.66225   x=151.542   y=62.7684
t=3.85333   x=198.558   y=82.2438
t=4.0444   x=260.162   y=107.761
t=4.23548   x=340.879   y=141.196
t=4.42656   x=446.639   y=185.003
t=4.61763   x=585.212   y=242.402
t=4.80871   x=766.778   y=317.609
t=4.99979   x=1004.68   y=416.15
t=5   x=1004.98   y=416.276

Code using C++ and NVCC:

#include<cuda_runtime.h>
#include<stdio.h>
#include <boost/numeric/odeint.hpp>
#include <iostream>
#include <vector>

using namespace boost::numeric::odeint;

std::vector<std::vector<double>> variable;
std::vector<double> times;

void system_of_equations(const std::vector<double>& variables,
	std::vector<double>& derivative_rates, const double time)
{
	derivative_rates[0] = variables[0] + variables[1];
	derivative_rates[1] = variables[0] - variables[1];
}

void printVariables(const std::vector<double>& variables, const double time)
{
	std::cout << "t=" << time << "   "
		<< "x=" << variables[0] << "   "
		<< "y=" << variables[1] << std::endl;

	variable.push_back(variables);
	times.push_back(time);
}

__global__ void hello()
{
	printf("Hello World!\n");
}


int main()
{
	std::vector<double> initial_variables = { 1.0, 0.0 }; 

	double start_time = 0.0, end_time = 5,
		time_step = 1e-4; 

	integrate(system_of_equations, initial_variables, start_time, end_time, time_step, printVariables);

	int* a;
	cudaMalloc(&a, 10 * sizeof(int));
	cudaFree(a);

	hello << <1, 10 >> > ();

	cudaDeviceReset();

	return 0;
}

Output:


t=0   x=1   y=0
t=0.0001   x=1.0001   y=0.0001
t=0.00055   x=1.00055   y=0.00055
t=0.002575   x=1.00258   y=0.00257501
t=0.0116875   x=1.01182   y=0.011688
t=0.0526938   x=1.05552   y=0.0527425
t=0.23332   x=1.29251   y=0.237577
t=0.413945   x=1.6143   y=0.437997
t=0.605022   x=2.07053   y=0.681595
t=0.796099   x=2.67888   y=0.975267
t=0.987176   x=3.48403   y=1.34059
t=1.17825   x=4.54515   y=1.8044
t=1.36933   x=5.94017   y=2.40077
t=1.56041   x=7.7716   y=3.17352
t=1.75148   x=10.174   y=4.17941
t=1.94256   x=13.3238   y=5.49234
t=2.13364   x=17.4525   y=7.20878
t=2.32471   x=22.8633   y=9.45482
t=2.51579   x=29.9538   y=12.3955
t=2.70687   x=39.2449   y=16.2468
t=2.89794   x=51.4192   y=21.2916
t=3.08902   x=67.371   y=27.9007
t=3.2801   x=88.2723   y=36.5596
t=3.47117   x=115.659   y=47.9043
t=3.66225   x=151.542   y=62.7684
t=3.85333   x=198.558   y=82.2438
t=4.0444   x=260.162   y=107.761
t=4.23548   x=340.879   y=141.196
t=4.42656   x=446.639   y=185.003
t=4.61763   x=585.212   y=242.402
t=4.80871   x=766.778   y=317.609
t=4.99979   x=1004.68   y=416.15
t=5   x=1004.98   y=416.276
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants