2-й удар :: device_vector для ядра

0

У меня есть тип данных, определенный как 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.

Есть ли способ, которым я могу привязать вектор устройства к указателю, которое может использовать ядро?

Теги:
vector
cuda
thrust

1 ответ

3
Лучший ответ

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)

  • 0
    Это отличное решение. Спасибо за помощь. Я бы принял этот ответ дважды, если бы мог.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню