Как связать объект поверхности с двухмерным массивом?

Я могу связать объект поверхности с массивом 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

0

Решение

Ссылаясь на документация по API:

cudaResourceDesc :: resType должен быть cudaResourceTypeArray, а cudaResourceDesc :: res :: array :: array должен быть установлен в допустимый дескриптор массива CUDA.

Вы не можете использовать это:

    rd.resType = cudaResourceTypePitch2D;

Вы должны использовать действительный cudaArray тип.

Вы можете обратиться к образцы куда (например, текстура без привязки) для примера правильной настройки объекта поверхности.

3

Другие решения


По вопросам рекламы [email protected]