проблемы с памятью при использовании float4 в тяге cuda

я столкнулся с проблемой памяти при использовании float4 в тяге cuda

добавление float4 "buggyVariable" в качестве члена функтора, по-видимому, приводит к тому, что данные с плавающей запятой смещаются влево на 1 поплавок.

в CUDA_animateParticles я четко установил Y на 0 и Z на 1

еще при запуске функтора и его рисовании в OpenGL. Я получаю частицы с Xposition=1, что указывает на то, что Y равно 1 внутри функтора.

я также тестировал с float2 и float3, они, похоже, работают нормально.

так что это похоже на проблему выравнивания памяти или ошибку.

Может кто-нибудь пролить некоторый свет на это? Спасибо за помощь.

#include <thrust/sort.h>
#include <thrust/random.h>
#include <thrust/device_vector.h>
#include "cutil_math.h"

struct animateParticles_functor
{
    float4 buggyVariable; //why does adding this variable cause following floats to get wrong values???
    float pex, pey, pez, pew;

    __host__ __device__
    animateParticles_functor( float x, float y, float z, float w) :
        pex(x), pey(y), pez(z), pew(w)
    {
    }

    template <typename Tuple>
    __host__ __device__
    void operator()(Tuple t)
    {
        if(pey > 0)
            thrust::get<0>(t) = make_float4(1, 0, 0, 0); //true if y is bugged
        else
            thrust::get<0>(t) = make_float4(0, 0, 0, 0); //false if its not bugged

        return;
    }
}

void CUDA_animateParticles(float4* cuda_devicePointer_vboPosition, float3* cuda_devicePointer_particleVelocitys, unsigned int numParticles, float4 particleEmitter)
{
    thrust::device_ptr<float4> d_pos(cuda_devicePointer_vboPosition);
    thrust::device_ptr<float3> d_vel(cuda_devicePointer_particleVelocitys);

    thrust::for_each(
        thrust::make_zip_iterator(thrust::make_tuple(d_pos, d_vel)),
        thrust::make_zip_iterator(thrust::make_tuple(d_pos + numParticles, d_vel + numParticles)),
        animateParticles_functor(0, 0, 1, 0) //notice that i set Z to 1 and not Y to 0
    );
}

person ColacX    schedule 18.03.2013    source источник


Ответы (1)


Я думаю, что есть некоторые разновидности MSVC, в которых nvcc и cl.exe не могут договориться о sizeof(float4).

Попробуйте заменить float4 на my_float4:

struct my_float4
{
  float x, y, z, w;
};
person Jared Hoberock    schedule 19.03.2013
comment
Разве размер float4 не очевиден независимо от того, какой компилятор вы используете? - person ColacX; 20.03.2013
comment
Выравнивание все усложняет. - person Jared Hoberock; 21.03.2013