Доступ к элементу переменной cusp из ядра устройства

У меня проблема с доступом и назначением переменной с типом cusp array1d из устройства / глобального ядра. Прикрепленный код выдает ошибку

alay.cu(8): warning: address of a host variable "p1" cannot be directly taken in a device function

alay.cu(8): error: calling a __host__ function("thrust::detail::vector_base<float, thrust::device_malloc_allocator<float> > ::operator []") from a __global__ function("func") is not allowed

Код ниже

#include <cusp/blas.h>
cusp::array1d<float, cusp::device_memory> p1(10,3);
__global__ void func()
{
p1[blockIdx.x]=p1[blockIdx.x]+blockIdx.x*5;
}
int main()
{
func<<<10,1>>>();
return 0;
}

1 ответ

Матрицы и массивы CUSP (и контейнеры Thrust, на которых они построены) предназначены только для хоста. Вы не можете напрямую использовать их в коде GPU.

Канонический способ заполнить разреженную матрицу CUSP состоит в том, чтобы создать ее в памяти хоста и скопировать ее в память устройства с помощью конструктора копирования, поэтому ваш тривиальный пример выглядит так:

cusp::array1d<float, cusp::host_memory> p1(10);
for(int i=0; i<10; i++) p1[i] = 4.f;
cusp::array1d<float, cusp::device_memory> p2(10) = p1; // data now on device

Если вы хотите манипулировать разреженной матрицей в коде устройства, вам нужно иметь ядро ​​специально для любого интересующего вас формата и передавать указатели на каждый из массивов устройств, содержащих данные матрицы, в качестве аргументов этого ядра. Существует хорошая аннотация источника Doxygen для всех редких типов, включенных в дистрибутив CUSP.


Ваше редактирование все еще не представляет ничего, что не могло бы быть сделано на хосте без ядра, а именно:

cusp::array1d<float, cusp::host_memory> p1(10, 3.f);
for(int i=0; i<10; i++) p1[i] += (i * 5.f);
cusp::array1d<float, cusp::device_memory> p2(10) = p1; // data now on device
Другие вопросы по тегам