2011-05-06 3 views
1

Я новичок в программировании OpenCL, и мой ввод представляет собой трехмерный массив. Я рассчитываю индекс как:3D-массивы в OpenCL

int gidX = get_global_id(0)?1:get_global_id(0); 
    int gidY = get_global_id(1)?1:get_global_id(1); 
    int gidZ = get_global_id(2)?1:get_global_id(2); 


    int index = gidX + (gidY*SizeX) + (gidZ*SizeY*SizeZ); 

Это правильный способ сделать это? Как использовать локальные идентификаторы потоков с 3D-массивами? Я использовал его с 2d массивов как:

int tid = get_local_id(0); 
int gid = get_global_id(0); 
int index = tid + gid*width; 

И есть ли способ, которым я мог бы использовать тип image3d_t для моего 3D объема?

Спасибо,
Саян

ответ

1

Это зависит от того, как у вас есть 3D-массив, линеаризованный в память. Но ответ Рика, закодированный как встроенная функция, будет работать нормально. Другая возможная оптимизация - это, по возможности, предварительная выборка в локальной памяти.

/* Visualize as a cube. You are looking at the front in x,y coordinates. Z is depth. You have stored it by starting at (x=0, y=0) and taking the depth z lists of elements one by one and placing them in a contiguous array.*/ 

//Inline this 
int matrix3D_lookup(int x, int y, int z, int sizeZ, int sizeX){ 
     return   z+ sizeZ*x +(sizeZ*sizeX*y); 
} 
3

Что вы, кажется, нужна некоторая базовая информация о функциональности и принципы работы OpenCL. Пожалуйста, обратитесь к следующим ссылкам:

  1. http://developer.download.nvidia.com/compute/cuda/3_2_prod/toolkit/docs/OpenCL_Programming_Guide.pdf
  2. http://www.nvidia.com/object/cuda_opencl_new.html
  3. http://developer.download.nvidia.com/compute/cuda/3_0/sdk/website/OpenCL/website/samples.html

образцы кода Вы для получения gidX, gidY и gidZ не имеет особого смысла и вычисление индекс тоже неправильный. Расчет зависит от порядка вашей 3D-матрицы. Он должен выглядеть примерно так:

int index = x + y * sizeX + z * sizeX * sizeY; 

Но сначала вы должны проверить документацию. Особенно принцип работы местных идентификаторов не объясняется быстро.