Cuda, как вы используете массив указателей с __constant__ - PullRequest
0 голосов
/ 19 января 2020

Мне нужно динамически изменять размер массива указателей типа int *, который запрашивается в каждом потоке экземпляра моего ядра.

Моя цель - создать массив целых чисел, в котором я не буду знать размер массива до времени выполнения (поэтому он не может быть фиксированного размера).

С этим, когда я делаю:

#include "CudaTest.cuh"
#include <stdio.h>
#include <iostream>
#include <ctime>

using namespace std;

__constant__ int* deviceArray;

bool CHECK(cudaError_t type)
{
    bool flag = true;
    const cudaError_t error = type;
    if (error != cudaSuccess)
    {
        printf("\n\n Error: %s:%d, ", __FILE__, __LINE__);
        printf("\n\n code:%d, reason: %s\n", error, cudaGetErrorString(error));
        flag = false;
    }
    return flag;
}

__global__
void myKernel()
{


    //=> // constValue should be 57. But getting an Invalid memory access error here. 
    int constValue = deviceArray[7];
    printf("\n deviceArray[7]; is: %i \n", constValue);

}


int main()
{
    int* hostAry = new int[8]();

    hostAry[7] = 57;
    CHECK(cudaMemcpyToSymbol(deviceArray, hostAry, sizeof(hostAry), 0, cudaMemcpyHostToDevice));

    myKernel << < 1, 1 >> > ();
    CHECK(cudaDeviceSynchronize());
    return 0;
}

Я получаю эту ошибку: Ошибка:

код : 700, причина: обнаружен недопустимый доступ к памяти

Память массива хоста не копируется в deviceArray. Я бью головой об стену, что обычно означает, что я чего-то принципиально не понимаю.

1 Ответ

2 голосов
/ 20 января 2020

Как использовать массив указателей с __constant__

Нет. Это невозможно.

Постоянная память должна быть статически определена во время компиляции. Это означает, что если вам нужен постоянный массив памяти, размер должен быть определен при компиляции кода. Нет способа динамически распределять постоянную память.

Единственное реалистичное решение c состоит в том, чтобы определить массив __constant__ для максимального размера, а затем вторую переменную __constant__, указывающую размер массива, который используется для данного вызова ядра. Итак, что-то вроде:

__constant__ int devicearray[MAXSIZE];
__constant__ int devicearray_n;

Скопируйте необходимые данные в devicearray и количество элементов в devicearray_n перед запуском ядра.

...