Я могу связать объект поверхности с массивом CUDA, но не смог связать его с двухмерным массивом.
Ниже приведен отдельный пример: (пожалуйста, игнорируйте другие проблемы управления ресурсами)
#include "cuda_runtime.h"#include <stdexcept>
#include <iostream>
void throw_on_error(cudaError_t ec)
{
if (ec)
throw std::runtime_error(cudaGetErrorString(ec));
}
int main()
{
try
{
char* p;
std::size_t stride;
throw_on_error(cudaMallocPitch(&p, &stride, 8, 8));
cudaSurfaceObject_t s;
cudaResourceDesc rd = {};
rd.resType = cudaResourceTypePitch2D;
auto& data = rd.res.pitch2D;
data.devPtr = p;
data.pitchInBytes = stride;
data.width = 8;
data.height = 8;
data.desc = cudaCreateChannelDesc<char>();
throw_on_error(cudaCreateSurfaceObject(&s, &rd));
}
catch (std::exception& e)
{
std::cout << e.what();
}
return 0;
}
Это печатает invalid argument
что здесь не так?
Возможность вычислений: 3.0
Ссылаясь на документация по API:
cudaResourceDesc :: resType должен быть cudaResourceTypeArray, а cudaResourceDesc :: res :: array :: array должен быть установлен в допустимый дескриптор массива CUDA.
Вы не можете использовать это:
rd.resType = cudaResourceTypePitch2D;
Вы должны использовать действительный cudaArray
тип.
Вы можете обратиться к образцы куда (например, текстура без привязки) для примера правильной настройки объекта поверхности.