В этом ядре 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 я генерирую TextObject, используя ``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