разбиране как текстурите работят с 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 текстурата?

Хардуерът за текстури се състои от две основни части, хардуер за филтриране на текстури и кеш памет за текстури. Филтрирането на текстури включва функционалност като интерполация, адресиране чрез нормализирани координати с плаваща запетая и обработка на адреси извън границите (режими на притискане, обвиване, огледално и гранично адресиране). Кешът за текстури може да съхранява данни в крива на запълване на пространството, за да увеличи максимално 2D пространствената локалност (и по този начин скоростта на попадение в кеша). Може също да съхранява данни в обикновен плосък масив.

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