Мне нужно динамически изменять размер массива указателей типа 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. Я бью головой об стену, что обычно означает, что я чего-то принципиально не понимаю.