关于定义一个__device__全局变量如何分配空间的问题
我的程序分两个文件
第一个是.cu,定义了全局变量,kernel函数和三个给全局变量分配空间销毁空间以及拷贝全局变量到host的函数
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#include <cutil.h>
/************************************************************************/
/* Init CUDA */
/************************************************************************/
#if __DEVICE_EMULATION__
bool InitCUDA(void){return true;}
#else
#define SIZE_X 8
#define SIZE_Y 8
#define SIZE_Z 8
__device__ float* d_val; //全局变量,存储kernel函数计算后的值
#endif
/************************************************************************/
/* Example */
/************************************************************************/
__global__ static void HelloCUDA()
{
for (int z=0;z<SIZE_Z;++z)
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
while (y<SIZE_Y)
{
x = threadIdx.x + blockIdx.x * blockDim.x;
while(x<SIZE_X)
{
d_val[x+SIZE_X*y+SIZE_X*SIZE_Y*z] = 56;/*computePower(d_value,EQUIP_NUM,x,y,z);*/
x+=blockDim.x*gridDim.x;
}
y+=blockDim.y*gridDim.y;
}
}
}
extern "C"
void kernel(dim3 gridSize, dim3 blockSize, float *h_val)
{
HelloCUDA<<<gridSize,blockSize>>>();
CUDA_SAFE_CALL( cudaMemcpy(h_val, d_val, sizeof(float)*SIZE_X*SIZE_Y*SIZE_Z, cudaMemcpyDeviceToHost));//最后程序运行,显示此处无效的参数,我觉得应该是kernel函数没有启动,应该是d_val没有分配到空间
}
extern "C"
void InitVal()
{
CUDA_SAFE_CALL( cudaMalloc((void**) &d_val, sizeof(float) * SIZE_X*SIZE_Y*SIZE_Z)); //给全局变量在分配空间,但好像没分配上
}
extern "C"
void clean()
{
CUDA_SAFE_CALL(cudaFree(d_val));
}另外还有一个CPP文件,包含了主函数,和运行以上几个函数,代码也一起贴出来吧
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#include <cutil.h>
#define SIZE_X 8
#define SIZE_Y 8
#define SIZE_Z 8
extern "C" void kernel(dim3 gridSize, dim3 blockSize, float *h_val);
extern "C" void InitVal();
extern "C" void clean();
/************************************************************************/
/* Init CUDA */
/************************************************************************/
bool InitCUDA(void)
{
int count = 0;
int i = 0;
cudaGetDeviceCount(&count);
if(count == 0) {
fprintf(stderr, "There is no device.\n");
return false;
}
for(i = 0; i < count; i++) {
cudaDeviceProp prop;
if(cudaGetDeviceProperties(&prop, i) == cudaSuccess) {
if(prop.major >= 1) {
break;
}
}
}
if(i == count) {
fprintf(stderr, "There is no device supporting CUDA.\n");
return false;
}
cudaSetDevice(i);
printf("CUDA initialized.\n");
return true;
}
int iDivUp(int a, int b){
return (a % b != 0) ? (a / b + 1) : (a / b);
}
/************************************************************************/
/* HelloCUDA */
/************************************************************************/
int main(int argc, char* argv[])
{
if(!InitCUDA()) {
return 0;
}
float *h_val;
h_val = (float*)malloc(SIZE_X*SIZE_Y*SIZE_Z*sizeof(float));
unsigned int timer = 0;
CUT_SAFE_CALL( cutCreateTimer( &timer));
CUT_SAFE_CALL( cutStartTimer( timer));
dim3 blockSize = dim3(8,8);
dim3 gridSize = dim3(iDivUp(SIZE_X,blockSize.x), iDivUp(SIZE_Y,blockSize.y));
kernel(gridSize, blockSize,h_val);
CUT_CHECK_ERROR("Kernel execution failed\n");
CUDA_SAFE_CALL( cudaDeviceSynchronize() );
CUT_SAFE_CALL( cutStopTimer( timer));
printf("Processing time: %f (ms)\n", cutGetTimerValue( timer));
CUT_SAFE_CALL( cutDeleteTimer( timer));
for (int k= 0;k<SIZE_X;++k)
{
for (int j= 0;j<SIZE_Y;++j)
{
for (int i= 0;i<SIZE_Z;++i)
printf("%f\n",h_val[i+j*SIZE_X+k*SIZE_Y*SIZE_X]);
printf("\n");
}
printf("\n");
}
printf("-------------->%f", h_val[4]);
//printf("%f\n",h_val);
free(h_val);
clean();
CUT_EXIT(argc, argv);
return 0;
}相关推荐
Graphics Device Interface
对GDI接口的详细设计说明 Graphics Device Interface (GDI) is a library that collects all low-level graphics APIs. MMI application should access LCD via GDI library. GDI library provide several feature for MMI framework. Some features are hardware accelerator and some features are software implementation. GDI must provide the highest performance for application. GDI library including several parts:
设备扩展(DEVICE_EXTENSION)
设备扩展(DEVICE_EXTENSION)是与设备对象相关的另一种重要的数据结构。可以用它来保存与特定设备关联的信息。设备扩展其实只是一个未分页的池,由驱动开发者来定义它的大小和内容。并由I/O管理器自动把它分配给设备对象,即设备对象的PVOID DeviceExtension字段。由于此结构是驱动开发者自定义的,所以必须要让系统知道需要给此结构预留多少空间,因此要把设备扩展结构的大小作为参数传递给IoCreateDevice函数。I/O管理器的IoCreateDevice函数将为设备对象和设备扩展对象.
结合实验代码device_create ()详解
结合实验代码device_create ()详解
USB Device(VID_1f3a_PID_efe8)
USB Device(VID_1f3a_PID_efe8)
编译带有RTX的工程时遇到CMSIS_device_header文件找不到问题解决方法.pdf
编译带有RTX的工程时遇到CMSIS_device_header文件找不到问题解决方法


