2013-03-18 3 views
2

CUDA я столкнулся с проблемой памяти при использовании Float4 в нажимной CUDAпроблемы с памятью при использовании Float4 в нажимной

добавив 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 
    ); 
} 

ответ

2

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

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

struct my_float4 
{ 
    float x, y, z, w; 
}; 
+0

не является размер float4 очевидной независимо от того, какой компилятор вы используете? – ColacX

+1

Выравнивание усложняет ситуацию. –

 Смежные вопросы

  • Нет связанных вопросов^_^