2D推力:: device_vector到内核
2d thrust::device_vector to kernel
我的数据类型定义为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更好)
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 在某些循环内使用vector.push_back时出现分段错误
- 当vector是tje全局变量时,c++中vector的内存管理
- std::vector的包装器,使数组的结构看起来像结构的数组
- 为什么(-1)%vector::size()总是返回0
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- CUDA内核和数学函数的显式命名空间
- 在C++中将类(带有Vector成员)保存为二进制文件
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 编译器如何区分std::vector的构造函数
- 将 int 数组转换为 std::vector<int*>
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 将 std::vector 传递给 openCL 内核C++绑定
- 当结合BSP库和std::vector时,我无法在内核之间发送数据