В этом ядре CUDA я оцениваю двумерные текстуры, которые в идеале должны возвращать двойное значение.
По умолчанию tex2D не возвращает двойное значение, и, видимо, способ сделать это — использовать массив CUDA с двумя каналами. Это решение, по-видимому, хорошо работает с чистыми оценками CUDA:
CUDA C — как использовать Texture2D для вычислений с плавающей запятой двойной точности
Подвох здесь (насколько далеко насколько я понимаю) заключается в том, что необходимо использовать ChannelFormatDescriptor с двумя 32-битными каналами.
Затем вы получаете двойные значения из текстуры, выполнив (в CUDA ядро):
Код: Выделить всё
static __inline__ __device__ double fetch_double(uint2 p){
return __hiloint2double(p.y, p.x);
}
__global__ void my_print(cudaTextureObject_t texObject)
{
uint2 rval = tex2D(texObject, x,y);
double dval = fetch_double(rval);
}
Однако, как только я попытаюсь использовать это с CuPy начинается моя проблема.
В CuPy я генерирую объект TextureObject, используя ChannelFormatDescriptor, следуя указаниям, приведенным в справочном примере выше.
Код: Выделить всё
ch=cp.cuda.texture.ChannelFormatDescriptor(32,32,0,0,cp.cuda.runtime.cudaChannelFormatKindUnsigned)
cu_array = cp.cuda.texture.CUDAarray(ch,Nx,Ny)
spline_coeffs = cp.zeros((Ny,Nx),dtype=cp.double)
cu_array.copy_from(spline_coeffs)
Код: Выделить всё
cu_array.copy_from(spline_coeffs)
File "cupy\cuda\texture.pyx", line 489, in cupy.cuda.texture.CUDAarray.copy_from
File "cupy\cuda\texture.pyx", line 400, in cupy.cuda.texture.CUDAarray._prepare_copy
ValueError: shape mismatch
На данный момент у меня такое ощущение, что проблема связана с тем фактом, что CUDAarray имеет два 32-битных канала, которые имеют разную структуру памяти по сравнению с массивом CuPy для cp.double< /код> тип. Но здесь я действительно не совсем понимаю, что происходит и, что более важно, что делать.
Есть идеи?
Подробнее здесь: https://stackoverflow.com/questions/788 ... lculations