對於這項記錄,這是作業,所以幫助儘可能少或考慮到這一點。我們使用常量內存來存儲「掩碼矩陣」,該矩陣將用於執行更大矩陣的卷積。當我在主機代碼中時,我使用cudaMemcpyToSymbol()將掩碼複製到常量內存中。CUDA如何在主機代碼中聲明常量內存時訪問設備內核中的常量內存?
我的問題是,這是複製過來,我啓動我的設備內核代碼如何設備知道在哪裏訪問常量內存掩碼矩陣。在內核啓動時是否需要傳遞一個指針?教授給我們的大部分代碼不應該改變(沒有指向通過的面具的指針),但總是有可能他犯了一個錯誤(儘管這很可能是我對某事的理解)
是否應該將恆定的memeory聲明包含在單獨的kernel.cu文件中?
我正在最小化代碼,以顯示與常量內存有關的事情。因此,請不要指出是否有未初始化的東西等。有代碼,但目前並不擔心。
main.cu:
#include <stdio.h>
#include "kernel.cu"
__constant__ float M_d[FILTER_SIZE * FILTER_SIZE];
int main(int argc, char* argv[])
{
Matrix M_h, N_h, P_h; // M: filter, N: input image, P: output image
/* Allocate host memory */
M_h = allocateMatrix(FILTER_SIZE, FILTER_SIZE);
N_h = allocateMatrix(imageHeight, imageWidth);
P_h = allocateMatrix(imageHeight, imageWidth);
/* Initialize filter and images */
initMatrix(M_h);
initMatrix(N_h);
cudaError_t cudda_ret = cudaMemcpyToSymbol(M_d, M_h.elements, M_h.height * M_h.width * sizeof(float), 0, cudaMemcpyHostToDevice);
//char* cudda_ret_pointer = cudaGetErrorString(cudda_ret);
if(cudda_ret != cudaSuccess){
printf("\n\ncudaMemcpyToSymbol failed\n\n");
printf("%s, \n\n", cudaGetErrorString(cudda_ret));
}
// Launch kernel ----------------------------------------------------------
printf("Launching kernel..."); fflush(stdout);
//INSERT CODE HERE
//block size is 16x16
// \\\\\\\\\\\\\**DONE**
dim_grid = dim3(ceil(N_h.width/(float) BLOCK_SIZE), ceil(N_h.height/(float) BLOCK_SIZE));
dim_block = dim3(BLOCK_SIZE, BLOCK_SIZE);
//KERNEL Launch
convolution<<<dim_grid, dim_block>>>(N_d, P_d);
return 0;
}
kernel.cu:這是我不知道如何訪問常量內存。
//__constant__ float M_c[FILTER_SIZE][FILTER_SIZE];
__global__ void convolution(Matrix N, Matrix P)
{
/********************************************************************
Determine input and output indexes of each thread
Load a tile of the input image to shared memory
Apply the filter on the input image tile
Write the compute values to the output image at the correct indexes
********************************************************************/
//INSERT KERNEL CODE HERE
//__shared__ float N_shared[BLOCK_SIZE][BLOCK_SIZE];
//int row = (blockIdx.y * blockDim.y) + threadIdx.y;
//int col = (blockIdx.x * blockDim.x) + threadIdx.x;
}
爲什麼你不能只傳遞一個指向常量內存的指針作爲你的卷積函數的參數? – rasen58