2D推力:: device_vector到内核

2d thrust::device_vector to kernel

本文关键字:内核 vector device 推力 2D      更新时间:2023-10-16

我的数据类型定义为typedef InitialState float[12]。我有一个矢量,其中包含由std::vector<InitialState> h_initials定义的几个初始状态。

我成为推力设备向量:thrust::device_vector<InitialState> d_initials = h_initials;

我想使用此数据是用户定义的内核。但是,我在将其投入原始指针时遇到了问题。我尝试了

float *p_initials = thrust::raw_pointer_cast(&d_initials[0]);

但是thrust抱怨function returning array is not allowed

有没有办法将设备向量施放到内核可以使用的指针?

初始状态(float [12])!= float

InitialState *p_initials = thrust::raw_pointer_cast(d_initials.data());
float* p_floats = (float*)p_initials;

但是,由于下面的怪异行为

,这通常是错误的。
typedef int int4[4];
void test(int4 a)
{
   std::cout << sizeof(a) << std::endl;
}
int main(int argc, char** argv)
{
  int4 f;
  std::cout << sizeof(f) << std::endl;//returns 16 (4*sizeof(int))
  test(f);//returns 8 (size of pointer, passes by reference)
}

更好的是:

struct InitialState{float value[12];}
std::vector<InitialState> h_initials;
thrust::device_vector<InitialState> d_initials = h_initials;
InitialState *p_initials = thrust::raw_pointer_cast(d_initials.data());
float* p_floats = (float*)p_initials;

和在cuda中,您可以使用初始状态*或float*作为参数(尽管SOA比AOS更好)