Проблема решена (если вам интересно; вы можете увидеть второй абзац; под чертой). Теперь у меня новый вопрос; Зачем #define BLOCK_DIM 16;
вызвать ошибку в функции ниже? Просто используйте 16
Это хорошо .
Вот ошибки
expected a "]"__local float2 block[BLOCK_DIM * (BLOCK_DIM + 1)] ;
^
line 110: error:
expected a ")"__local float2 block[BLOCK_DIM * (BLOCK_DIM + 1)] ;
^
line 110: error: operand
of "*" must be a pointer
__local float2 block[BLOCK_DIM * (BLOCK_DIM + 1)] ;
error:
expected a ";"int Idout = get_local_id(0)*(BLOCK_DIM+1)+get_local_id(1);
^
и функция
__kernel void transpose(
__global float2* dataout,
__global float2* datain,
int width, int height)
// width = N (signal length)
// height = batch_size (number of signals in a batch)
{
// read the matrix tile into shared memory
__local float2 block[32 * (32 + 1)] ;
unsigned int xIndex = get_global_id(0);
unsigned int yIndex = get_global_id(1);
if((xIndex < width) && (yIndex < height))
{
unsigned int index_in = yIndex * width + xIndex;
int Idin = get_local_id(1)*(32+1)+get_local_id(0);
block[Idin]= datain[index_in];
}
barrier(CLK_LOCAL_MEM_FENCE);
// write the transposed matrix tile to global memory
xIndex = get_group_id(1) * 32 + get_local_id(0);
yIndex = get_group_id(0) * 32 + get_local_id(1);
if((xIndex < height) && (yIndex < width))
{
unsigned int index_out = yIndex * height + xIndex;
int Idout = get_local_id(0)*(32+1)+get_local_id(1);
dataout[index_out] = block[Idout];
}
}
===============================
Я работаю над улучшением производительности 2D FFT на изображениях. После теста; Я переконфигурирую функцию транспонирования — причина замедления работы программы, поэтому я заменяю ее на более оптимизированную.
Но после этого; Я получил код возврата всех функций, которые раньше работали нормально CL_INVALID_KERNEL_NAME
, За исключением функции транспонирования и clSetKernelArg
в коде хоста; Я больше ничего не меняю. Так что я не в курсе. Надеюсь, вы, ребята, выручите меня 🙂
ОБНОВЛЕНИЕ: вот ошибки. Не обращайте внимания на номер строки 🙂 Эти строки кажутся мне нормальными. Что-то не так ?
ошибка:
expected a "]"__local float2 block[BLOCK_DIM * (BLOCK_DIM + 1)] ;
^
line 110: error:
expected a ")"__local float2 block[BLOCK_DIM * (BLOCK_DIM + 1)] ;
^
line 110: error: operand
of "*" must be a pointer
__local float2 block[BLOCK_DIM * (BLOCK_DIM + 1)] ;
error:
expected a ";"int Idout = get_local_id(0)*(BLOCK_DIM+1)+get_local_id(1);
^
Здесь файл ядра
Новый :
#define BLOCK_DIM 16
__kernel void transpose(
__global float2* dataout,
__global float2* datain,
int width, int height)
// width = N (signal length)
// height = batch_size (number of signals in a batch)
{
// read the matrix tile into shared memory
__local float2 block[BLOCK_DIM * (BLOCK_DIM + 1)] ;
unsigned int xIndex = get_global_id(0);
unsigned int yIndex = get_global_id(1);
if((xIndex < width) && (yIndex < height))
{
unsigned int index_in = yIndex * width + xIndex;
int Idin = get_local_id(1)*(BLOCK_DIM+1)+get_local_id(0);
block[Idin]= datain[index_in];
}
barrier(CLK_LOCAL_MEM_FENCE);
// write the transposed matrix tile to global memory
xIndex = get_group_id(1) * BLOCK_DIM + get_local_id(0);
yIndex = get_group_id(0) * BLOCK_DIM + get_local_id(1);
if((xIndex < height) && (yIndex < width))
{
unsigned int index_out = yIndex * height + xIndex;
int Idout = get_local_id(0)*(BLOCK_DIM+1)+get_local_id(1);
dataout[index_out] = block[Idout];
}
}
Ваш #define вопрос .. им не нужны точки с запятой. По сути, #define X Y заменит все вхождения «X» в «Y» в коде перед компиляцией, если в конце добавить точку с запятой, которая станет частью «Y» и создаст много синтаксических ошибок. #Define — это не утверждение.
На самом деле, это упрощенное объяснение, но его достаточно для охвата этого вопроса (если вы хотите узнать больше, я рекомендую вам взглянуть на учебники и документацию по препроцессору).
Других решений пока нет …