Преобразование Cuda Array1 из Typename1 в Array2 из Typename2 - PullRequest
0 голосов
/ 06 декабря 2010

Дорогие Ученые Cuda,
Ищите решение для следующей проблемы

а) У меня есть два массива 1) массив1 размера1, имеющий тип1 2) массив2 с размером1, имеющий тип2

б) Я хочу написать ядро ​​следующего прототипа

__global__ kernel(void* dest, void* src, int dest_sizeoftype, int src_sizeoftype, int num_array_elts);

в) Предположим, я создаю num_array_elts cuda-потоков, каждый из которых копирует свой elt из src в целевой.

Issue: a) Я зациклен на том, какую функцию использовать для копирования num_bytes из src в dest в ядре.

Заранее благодарю С Уважением, Nagaraju

Ответы [ 2 ]

2 голосов
/ 06 декабря 2010

Алгоритм copy в Тяга делает это простым.

#include <thrust/copy.h>
#include <thrust/device_ptr.h>

int   * src = ...
float * dst = ...

// first wrap the 'raw' pointers
thrust::device_ptr<int>   wrapped_src(src);
thrust::device_ptr<float> wrapped_dst(dst);

// then pass wrapped pointers to copy()
thrust::copy(wrapped_src, wrapped_src + num_array_elts, wrapped_dst);

Дополнительную информацию о тяге см. В руководстве QuickStart .

0 голосов
/ 09 декабря 2010

Если вы знаете типы двух массивов, эта проблема становится довольно тривиальной.

__global__ kernel(float* dest, int* src){

    int idx=blockIdx.x*blockDim.x+threadIdx.x;
    dest[ idx ] = src[ idx ];

}

Если в вашем массиве dest было использовано большее слово, например двойной, это все равно будет работать, и не нужно будет знать количество байтов. Просто убедитесь, что вы используете правильное количество байтов при использовании cudamalloc .

...