Доступ к элементу переменной 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;
}

person user3040447    schedule 27.11.2013    source источник


Ответы (1)


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

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

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
person talonmies    schedule 27.11.2013
comment
да, я хочу манипулировать устройством array1d через поток устройства, не могли бы вы уточнить или дать пример кода, так как я до сих пор не понимаю? - person user3040447; 27.11.2013
comment
Просто сомневаюсь, вы имели в виду, что cusp::array1d<float, cusp::host_memory> p2(10) = p1; будет cusp::array1d<float, cusp::device_memory> p2(10) = p1;, не так ли? - person Sagar Masuti; 27.11.2013
comment
нет, я отредактировал вопрос и код, чтобы сделать мой вопрос более понятным - person user3040447; 27.11.2013
comment
Взгляните на необработанные примеры здесь - person Robert Crovella; 27.11.2013
comment
@SagarMasuti: Да, это была просто ошибка копирования и вставки. я отредактировал ответ - person talonmies; 27.11.2013