понимание того, как текстуры работают с CUDA

Я запутался, как текстуры работают с CUDA

например, когда я делаю запрос устройства «на моем GTX 780», я нахожу это:

Maximum Texture Dimension Size (x,y,z)  1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)

теперь, когда я исследовал "пример частиц" CUDA, я нашел это:

checkCudaErrors(cudaBindTexture(0, oldPosTex, sortedPos, numParticles*sizeof(float4)));

где numParticles в моем случае я увеличил его до 1024 * 1024 * 2 (около 2,1 миллиона)

как это вписывается в 1D текстуру??

также внутри ядер я нашел это «нужно больше объяснить, пожалуйста, так как все здесь связано»

texture<float4, 1, cudaReadModeElementType> oldPosTex;
#define FETCH(t, i) tex1Dfetch(t##Tex, i)

в ядре:

float4 pos = FETCH(oldPos, sortedIndex); 

Теперь, что мне нужно знать, я могу использовать эту текстуру "с ее определенным размером numParticles*sizeof(float4) в отрисовке кадрового буфера вместо отрисовки VBO?


person Mohamed Sakr    schedule 22.11.2013    source источник
comment
объясните, почему проголосовали против, задав простую вещь, которую я не понимаю   -  person Mohamed Sakr    schedule 22.11.2013


Ответы (1)


как это вписывается в 1D текстуру?

Аппаратное обеспечение текстур состоит из двух основных частей: аппаратного обеспечения фильтрации текстур и кэша текстур. Фильтрация текстур включает в себя такие функции, как интерполяция, адресация по нормализованным координатам с плавающей запятой и обработка адресов за пределами границ (режимы адресации с зажимом, переносом, зеркалированием и границей). Кэш текстур может хранить данные в виде кривой заполнения пространства, чтобы максимизировать двумерную пространственную локальность (и тем самым частота попаданий в кэш). Он также может хранить данные в обычном плоском массиве.

Maximum Texture Dimension Size относится к ограничениям в оборудовании для фильтрации текстур, а не в оборудовании для кэширования текстур. Таким образом, это относится к ограничениям, которые вы можете достичь при использовании таких функций, как tex2D(), но не при использовании таких функций, как tex1Dfetch(), которая выполняет нефильтрованный поиск текстуры. Итак, код, который вы дали, вероятно, настраивает что-то для tex1Dfetch().

нужно больше объяснить, пожалуйста, так как все здесь связано

Этот вопрос слишком широк, и, возможно, поэтому ваш вопрос был отклонен.

Теперь, что мне нужно знать, я могу использовать эту текстуру "с ее определенным размером numParticles*sizeof(float4) в отрисовке кадрового буфера вместо отрисовки VBO?

Это не вопрос CUDA, поскольку CUDA ничего не может рисовать. Вы должны изучить взаимодействие CUDA OpenGL, чтобы узнать, есть ли там ответ на ваш вопрос. Если это не так, вам следует создать новый вопрос и более четко описать свой вопрос.

person Roger Dahl    schedule 22.11.2013
comment
большое спасибо за разъяснения :), беспокоился об этом ограничении, так как я использую текстуру только для хранения своих данных, хотя мне нужно понять больше; при использовании cudaBindTexture это похоже на CudaMalloc? так что он указывает известный размер для этой текстуры? - person Mohamed Sakr; 22.11.2013