首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于一个cuInit的问题
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sxy0082002
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-05-27 11:28:00 楼主
    我在CPP中试着初始化一个CUDA Context 但是在运行cuInit(0)的时候提示Stack overflow
    递归指定是不可能了
    难道是因为深度的函数调用导致?
    那么需要如何修改呢?
    我做的是MFC
    准备在一个图像计算的部分使用GPU运算:)
    C/C++ code
    #include "stdafx.h" #define NUM_INTS 32 // includes, CUDA #include <cuda_runtime.h> #include <cuda.h> // includes, Project typedef struct _CUDAContext_st { CUcontext hcuContext; CUmodule hcuModule; CUfunction hcuFunction; CUdeviceptr dptr; int deviceID; } CUDAContext;//CUDA Context结构体 extern "C" void InitCUDAContext( CUDAContext *pContext, CUdevice hcuDevice, int deviceID ); extern "C" int InitCUDA(CUDAContext * cu_context) { int cDevices; int hcuDevice = 0; CUresult status; //调用其它函数前 必须初始化API status = cuInit(0); // 获得所有设备数量 status = cuDeviceGetCount( &cDevices ); if ( CUDA_SUCCESS != status ) return 1; if ( cDevices == 0 ) { return 1;//无硬件设备 } //初始化所有硬件设备(多显卡)因为只有一块显卡 故只执行一次 for ( int iDevice = 0; iDevice < cDevices; iDevice++ ) { char szName[256]; //获得当前设备句柄返回指针到 hcuDevice status = cuDeviceGet( &hcuDevice, iDevice ); if ( CUDA_SUCCESS != status ) return 1; //返回当前设备名称 最大大小为256 status = cuDeviceGetName( szName, 256, hcuDevice ); if ( CUDA_SUCCESS != status ) return 1; // 获得设备的内部参数 //CUdevprop devProps; //CUDA_SUCCESS == cuDeviceGetProperties( &devProps, hcuDevice ) // 初始化 CUDA Context InitCUDAContext( cu_context, hcuDevice, iDevice ); } } ////////////////////////////////////////////////////// // // // pContext 自定义结构体 包括Context // // // // // // 初始化CUDA context // // // // // // // // // // // ////////////////////////////////////////////////////// void InitCUDAContext( CUDAContext *pContext, CUdevice hcuDevice, int deviceID ) { CUcontext hcuContext = 0; CUmodule hcuModule = 0; CUfunction hcuFunction = 0; CUresult status = cuCtxCreate( &hcuContext, 0, hcuDevice ); if ( CUDA_SUCCESS != status ) { //创建线程失败 } status = CUDA_ERROR_INVALID_IMAGE; // 将模块加载到当前Context中 status = cuModuleLoad(&hcuModule,"iradon_kernel.cubin"); // 返回当前模块中模块中指向函数的指针 status = cuModuleGetFunction( &hcuFunction, hcuModule, "CUDA_iradon" ); // CUdeviceptr dptr; status = cuMemAlloc( &dptr, NUM_INTS*sizeof(int) ); // Here we must release the CUDA context from the thread context status = cuCtxPopCurrent( NULL ); pContext->hcuContext = hcuContext; pContext->hcuModule = hcuModule; pContext->hcuFunction = hcuFunction; pContext->dptr = dptr; pContext->deviceID = deviceID; } void ThreadProc(CUDAContext *pParams) { int wrong = 0; // 将CUDA context 放入 当前的线程中 // cuCtxPushCurrent: Attach the caller CUDA context to the thread context. CUresult status = cuCtxPushCurrent( pParams->hcuContext ); // 设置Context中线程块的维数x,y,z cuFuncSetBlockShape( pParams->hcuFunction, 32, 1, 1 ); // 为kernel相关的Function设置整型参量 // cuParamSeti(CUfunction func,int offset,unsigned int value); cuParamSeti( pParams->hcuFunction, 0,10 ); cuParamSeti( pParams->hcuFunction, sizeof(int),10); //为函数中的参数设定总参数大小 cuParamSetSize( pParams->hcuFunction, sizeof(int)*2 ); // cuLaunch: we kick off the CUDA "kernelFunction" // 启动相关函数 status = cuLaunch( pParams->hcuFunction ); //if ( CUDA_SUCCESS == cuMemcpyDtoH( pInt, pParams->dptr, NUM_INTS*sizeof(int) ) ); //cuMemFree( pParams->dptr ); //销毁当前线程中正在使用的CUDA context // cuCtxPopCurrent: Detach the current CUDA context from the calling thread. cuCtxPopCurrent( NULL ); } void InitCUDA_Radon() { CUDAContext cuda_context; InitCUDA(&cuda_context); ThreadProc(&cuda_context); }



    然后我在另一个CPP文件中调用了InitCUDA_Radon() 结果就...
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • OpenHero
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-28 13:13:251楼 得分:0
    问题解决了吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cyrosly
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-31 17:52:442楼 得分:0
    你不应该在cuCtxPopCurrent中使用NULL,
    那样实际上等于没有从thread stack中弹出(前面压入的ctx),你在InitCUDA和ThreadProc中2次cuCtxPushCurrent将2个同样的thread ctx压栈,这就相当于同一个context用于多个(你这里是2个)不同的thread.当然会溢出了.你这样改下试试:
    C/C++ code
    cuCtxPopCurrent(&pParams->hcuContext);//2处(InitCUDA,ThreadProc都要改)

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sxy0082002
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-01 23:07:053楼 得分:0
    好的 我回去试一下
    这个是以前写的 当时还搞不明白那是哪呢
    不过我记得当时把status = cuInit(0);放到主函数去了就没事了
    但是找不到hcuContext应该就是你说的原因了吧
    还是继续看看手册的
    等我把程序挑出后再封贴哈~
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved