我有一个定义为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
。
有没有一种方法可以将设备向量转换为内核可以使用的指针?
最佳答案
InitialState(float [12])!=浮点数
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中,您可以使用InitialState *或float *作为参数(尽管SOA比AOS更好)