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 я генерирую объект 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)
Однако, как только я пытаюсь скопировать некоторые данные в 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»