ПрограммированиеФорумОбщее

Преобразование типов в CUDA

#0
22:43, 10 окт 2010

Есть массив unsigned char, нужно работать с ним 32 и 64 битными кусками.
Пытаюсь реализовать это так:

typedef unsigned long long Uint64;
typedef unsigned int   Uint32;
unsigned char keybuf_char[in_message_length[0]];
.... // задаем значения элементов keybuf_char
Uint32 *keybuf_32 = (Uint32*)keybuf_char;

На выходе получаем ошибку "error: identifier "__eh_curr_region" is undefined" в строке "Uint32 *keybuf_32 = (Uint32*)keybuf_char;"

#1
23:09, 10 окт 2010

union buf{
  unsigned int AsUINT32;
  char AsChar[4];
}?

Еще мне кажется, что:

unsigned char keybuf_char[in_message_length[0]];

Так писать нельзя, так как in_message_length[0] не определена в момент компиляции, если там не константа конечно-же...

#2
23:13, 10 окт 2010

Спасибо, тоже только что вспомнил про union из институтского курса языка C
А разве он не может выделить память исходя из значения переменной?

P.S. Всё таки программирование на python развращает :)

#3
23:21, 10 окт 2010

Сделаю cudaMalloc на host'е.  Только можно ли будет указатель вписать в union?

#4
23:53, 10 окт 2010

falrus
> А разве он не может выделить память исходя из значения переменной?

unsigned char* keybuf_char = new unsigned char[in_message_length[0]];

Потом не забудь удалить...

falrus
> Только можно ли будет указатель вписать в union?
Всмысле?

#5
0:15, 11 окт 2010

MarkoPolo
Я имел ввиду такой вариант:

 union buf_union {
  Uint32 *a;
  Uint64 *b;
  char *c;
  } keybuf;
  keybuf.a=(Uint32*)&in_message[32*threadIdx.x]; // in_message -- массив, переданный с host'а, место под который было выделено при помощи cudaMalloc. Каждый thread получает свой диапазон памяти в этом массиве
  keybuf.c[0]=8;

Но Ваш вариант мне нравится больше.

#6
0:40, 11 окт 2010

MarkoPolo
На попытку выделить память при помощи

unsigned char* keybuf_char = new unsigned char[in_message_length[0]];

ругается ошибкой "Error: External calls are not supported (found non-inlined call to _Znam)"

#7
0:58, 11 окт 2010

falrus
В девайс коде нельзя делать new и т.п. Учите матчасть, вопросы странные.

#8
11:35, 11 окт 2010

falrus
Возможно тебе подойдет char4. Тогда можно будет на стороне хоста создать массив char, а на стороне девайса char4. После подгрузки в шеред память можно будет к элементам вектора char4 обращаться  последовательно в одном треде.

ПрограммированиеФорумОбщее

Тема в архиве.