我想使用全局变量在两次内核调用之间将数据保存在内存中,但是我无法弄清楚如何分配内存以及如何正确访问它。下面的代码给出了错误的输出。
我需要使用指针,因为我的设备方法“输出”了未知的数据大小。该程序将在有向图中寻找强连通的顶点-显然可能没有,也可能有milion。 想法是调用内核,询问数据有多大,然后将其内存复制到主机内存。我是cuda的新手,所以我不知道有什么设计方法可以解决我的问题。
__device__ int* d_array;
__global__ void doCalculation(int* adr, int testSize) {
// Index evaluation
int threadsPerBlock = blockDim.x * blockDim.y * blockDim.z;
int threadPosInBlock = threadIdx.x +
blockDim.x * threadIdx.y +
blockDim.x * blockDim.y * threadIdx.z;
int blockPosInGrid = blockIdx.x +
gridDim.x * blockDim.y +
gridDim.x * gridDim.y * blockIdx.z;
int tid = blockPosInGrid * threadsPerBlock + threadPosInBlock;
// "calculations"
if (tid < testSize) {
adr[tid] = 1;
}
}
void startCalculation() {
dim3 block(8, 8, 8);
dim3 grid(16,16);
int testSize = 5;
cudaMalloc(&d_array, testSize * sizeof(int));
int* d_addr;
cudaGetSymbolAddress((void**)&d_addr, d_array);
doCalculation<<<grid, grid>>>(d_addr, testSize);
cudaDeviceSynchronize();
int* array = (int*)malloc(testSize * sizeof(int));
cudaMemcpyFromSymbol(array, d_array, testSize*sizeof(int));
for (int i = 0; i < testSize; i++)
{
std::cout << "Array at " << i << " is " << array[i] << std::endl;
} //This outputs -842150451 in my case
}