gpt4 book ai didi

c++ - 2d thrust::device_vector 到内核

转载 作者:行者123 更新时间:2023-11-28 00:34:36 25 4
gpt4 key购买 nike

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

我把它做成一个推力装置 vector :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 .

有没有办法将设备 vector 转换为内核可以使用的指针?

最佳答案

InitialState (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 中,您可以使用 InitialState* 或 float* 作为参数(尽管 SOA 比 AOS 工作得更好)

关于c++ - 2d thrust::device_vector 到内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21461005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com