При тестировании, если я знаю, как распределять объекты поверхности, я проектировал фиктивное ядро для чтения одного значения.
Это ядро не работало во время компиляции, потому что
"ни один экземпляр перегруженной функции" surf3Dread "не соответствует списку аргументов"
__global__ void test_surface(cudaSurfaceObject_t surfImg,int x, int y, int z){
float test = surf3Dread(surfImg , (int)(x*sizeof(float)) , y , z ,cudaBoundaryModeZero);
printf("%f \n",test);
}
it работает, когда я делаю это вместо этого:
__global__ void test_surface(cudaSurfaceObject_t surfImg,int x, int y, int z){
float test;
surf3Dread(&test,surfImg , (int)(x*sizeof(float)) , y , z ,cudaBoundaryModeZero);
printf("%f \n",test);
}
Это на самом деле не проблема, но я делал первое, потому что документация surf3Dread
заявляет , что эта функция определена как :
template<class T>
T surf3Dread(cudaSurfaceObject_t surfObj,
int x, int y, int z,
boundaryMode = cudaBoundaryModeTrap);
template<class T>
void surf3Dread(T* data,
cudaSurfaceObject_t surfObj,
int x, int y, int z,
boundaryMode = cudaBoundaryModeTrap);
Возможно, я неправильно понимаю документацию, но я бы сказал, что первое ядро здесь соответствует первому документированному способу вызова функции, а второе ядро - второму. Почему работает только один? Если я неправильно понял первую функцию в документации, как вы называете эту версию?
Я использую CUDA 10.2