Cupy - Проблема с текстурами для вычислений двойной точности.Python

Программы на Python
Anonymous
Cupy - Проблема с текстурами для вычислений двойной точности.

Сообщение Anonymous »

Я написал ядро ​​cuda, которое работает с массивами двойной точности.
В этом ядре 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);

}
Когда я компилирую это ядро ​​cuda и генерирую файл .cubin, все работает нормально.
Однако, как только я попытаюсь использовать это с 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)
Однако, как только я пытаюсь скопировать некоторые данные в CUDAArray, я получаю сообщение об ошибке:

Код: Выделить всё

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
Обратите внимание, что этой проблемы не существует, если я использую числа одинарной точности (с одним каналом для массива cuda) и типы cp.float32 в Python.
На данный момент у меня такое ощущение, что проблема связана с тем фактом, что CUDAarray имеет два 32-битных канала, которые имеют другое расположение памяти, чем массив cupy для cp.double< /код> тип. Но здесь я действительно не понимаю, что происходит и, что более важно, что делать.
Есть идеи??

Подробнее здесь: https://stackoverflow.com/questions/788 ... lculations

Вернуться в «Python»