У меня есть тип данных, определенный как typedef InitialState float[12]
. У меня есть вектор, содержащий несколько начальных состояний, определяемых std::vector<InitialState> h_initials
.
Я сделал вектор вектора thrust::device_vector<InitialState> d_initials = 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])! = 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)