У меня есть линейный массив int
arr
, который находится в глобальной памяти CUDA. Я хочу установить подмассивы arr
в определенные значения. Начальные индексы подмассива задаются массивом starts
, а длина каждого подмассива задается массивом counts
.
Что я хочу сделать, так это установить значение подмассива i
, начиная с starts[i]
и продолжая до counts[i]
до значения starts[i]
. То есть операция:
arr[starts[i]: starts[i]+counts[i]] = starts[i]
Я подумал об использовании memset()
в ядре для установки значений. Однако он не записывается правильно (элементам массива присваиваются некоторые случайные значения). Код, который я использую:
#include <stdlib.h>
__global__ void kern(int* starts,int* counts, int* arr,int* numels)
{
unsigned int idx = threadIdx.x + blockIdx.x*blockDim.x;
if (idx>=numels[0])
return;
const int val = starts[idx];
memset(&arr[val], val, sizeof(arr[0])*counts[idx]) ;
__syncthreads();
}
Обратите внимание, что numels[0]
содержит количество элементов в массиве starts
.
Я проверил код с помощью cuda-memcheck()
, но не получил никаких ошибок. Я использую PyCUDA
, если это уместно. Я, вероятно, неправильно понимаю использование memset здесь, поскольку я изучаю CUDA.
Не могли бы вы предложить способ исправить это? Или другой эффективный способ выполнить эту операцию.
P.S: Я знаю, что thrust::fill()
, вероятно, может это делать хорошо, но, поскольку я изучаю CUDA, я хотел бы знать, как это сделать без использования внешних библиотек.
memset
работает сunsigned char
с, а не сint
с. - person molbdnilo   schedule 29.07.2018unsigned char
? - person Geralt   schedule 29.07.2018