请教share memory的用法(很急)

chenbo888666999 2009-08-21 09:04:54
我是个cuda新手,关于share memory的用法有几点不清楚:

(1)假如我的kernel里要用到多个共享数组,我是否可以向下面这样声明:

__shared__ int A[100][6];

__shared__ int B[20];

__shared__ int C[50];

,但是我好像在有些资料上看到说,同一个kernel里的每个share memory的起始地址都相同,需要计算偏移量,不能像上面那样做,我有些不确定,还请高手多多指教。

(2)我写了一个cuda程序,编译通过,但运行时,出现错误,错误输出为:
1>------ 已启动生成: 项目: CUDA_3SAT, 配置: Release Win32 ------
1>正在链接...
1>cuda_3sat.obj : error LNK2001: 无法解析的外部符号 ___cudaUnregisterFatBinary@4
1>cuda_3sat.obj : error LNK2001: 无法解析的外部符号 _cudaLaunch@4
1>cuda_3sat.obj : error LNK2001: 无法解析的外部符号 _cudaSetupArgument@12
1>cuda_3sat.obj : error LNK2001: 无法解析的外部符号 ___cudaRegisterFunction@40
1>cuda_3sat.obj : error LNK2001: 无法解析的外部符号 ___cudaRegisterFatBinary@4
1>cuda_3sat.obj : error LNK2001: 无法解析的外部符号 _cudaGetErrorString@4
1>cuda_3sat.obj : error LNK2001: 无法解析的外部符号 _cudaMemcpy@16
1>cuda_3sat.obj : error LNK2001: 无法解析的外部符号 _cudaConfigureCall@32
1>cuda_3sat.obj : error LNK2001: 无法解析的外部符号 _cudaMalloc@8
1>cuda_3sat.obj : error LNK2001: 无法解析的外部符号 __imp__cutCheckCmdLineFlag@12
1>cuda_3sat.obj : error LNK2001: 无法解析的外部符号 _cudaFree@4

,我曾尝试单步调试,不行,有人知道出现这种错误的原因吗?
...全文
1063 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenbo888666999 2009-08-23
  • 打赏
  • 举报
回复
呵呵,我刚才又换了一个向导:CUDA VS Wizard 2.0 W32 Release ,这个比上次用的CUDA_VS_Wizard要

新,这次就好了,可以运行向导自带的例子了。

谢谢大家的帮助,最近打算好好学习CUDA编程,所以会经常向大家请教。
chenbo888666999 2009-08-23
  • 打赏
  • 举报
回复
回答12楼:

我用的向导是开勇大哥更新过的版本,而且我也看了我的环境变量CUDA_INC_PATH,中间并没有空格,所以应该不是这个错误。

回答11楼:“在前面加上#pragma comment(lib,"cudatr.lib")试下”,不好意思,呵呵,我还没明白你

的意思,不知道怎么添加,在哪添加#pragma comment(lib,"cudatr.lib")
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 l7331014 的回复:]
nvcc fatal  : A single input file is required for a non-link phase when an outputfile is specified
[/Quote]

对不起,搞错了.

下面引自开勇:

两天的修改,修改了几个bug,添加了exe lib dll 向导功能
1.修改上两个版本中A single input file is required for a non-link phase when an output file is specified bug,这个bug是由于include的路径中间有空格;

原文:
http://blog.csdn.net/OpenHero/archive/2008/06/08/2523354.aspx
Cyrosly 2009-08-23
  • 打赏
  • 举报
回复
1:可以,那些资料说的是动态分配共享内存的情况(即前面使用extern 关键字)
2:在前面加上#pragma comment(lib,"cudatr.lib")试下
chenbo888666999 2009-08-23
  • 打赏
  • 举报
回复
呵呵,不明白。

.cu文件是空的?是说.cu原文件是空的吗?但我用的是向导自带的例子CUDAWin32App1.cu,到底是什么原

因?还请说得详细点。
  • 打赏
  • 举报
回复
1)是
2)
nvcc fatal : A single input file is required for a non-link phase when an outputfile is specified
.cu文件是空的???
chenbo888666999 2009-08-23
  • 打赏
  • 举报
回复
谢谢你的解答。

(1)也就是说,向我那样声明的count只能被一个block中的线程共享,是吗?

(2)编译没有错误,但在运行时会弹出一个对话框:发生生成错误,要继续并运行上次的成功生成吗。

输出窗口显示的信息为:

1>------ 已启动生成: 项目: CUDAWin32App1, 配置: Release Win32 ------
1>Compiling...
1>nvcc fatal : A single input file is required for a non-link phase when an outputfile is specified
1>正在链接...
1>LINK : fatal error LNK1181: 无法打开输入文件“.\release\CUDAWin32App1.obj”
1>生成日志保存在“file://f:\cuda programs\CUDAWin32App1\CUDAWin32App1\Release\BuildLog.htm”
1>CUDAWin32App1 - 1 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========


  • 打赏
  • 举报
回复
1)不行.理由是smem只对同一个block中的线程共享,没法被kernel的所有线程共享.只有申请成全局变量,而且要注意用原子操作.
2)前面还有错误吧?obj文件个没有生成.把整个编译输出信息贴出来.
chenbo888666999 2009-08-23
  • 打赏
  • 举报
回复
谢谢你们的回答,正如5楼所说的,是我没加cudart.lib cutil32D.lib,加上就好了。但我又有两个问题,还请大家帮忙解答:

(1)如果我想在kernel中声明一个计数器变量count,因为变量count是要被执行kernel的所有线程共享的,所以我是否可以这样声明:
.................
__shared__ int count;
count=0;
..............

(2)我用开勇大哥的CUDA_VS_Wizard向导生成项目时,运行向导自带的例子时会出错:

>LINK : fatal error LNK1181: 无法打开输入文件“.\release\CUDAWin32App1.obj”

我看了release文件夹,里面确实没有CUDAWin32App1.obj,请问这是为什么呀?
huangshuojch 2009-08-22
  • 打赏
  • 举报
回复
这个好像是缺少lib造成的,把lib添加到linker里应该就可以
  • 打赏
  • 举报
回复
1)可以
2)cudart.lib cutil32.lib kernel32.lib连接了吗?或者LIBPATH正确设置了吗?
chenbo888666999 2009-08-21
  • 打赏
  • 举报
回复
恩,我不是用CUDA_VS_Wizard建立的,开始我是用向导,但运行向导自带的例子都有问题,所以我就按照一个说明自行设置的,设置好后,我把原来向导中的例子,copy过来运行没有问题,这说明我设置是正确的吧。

(1)如果参照SDK中“matrixMul”sample的话,应该可以向我上面那样列举的,在同一个kernel任意声明多个共享数组。

(2)我的工程文件中包括的头文件有:

#include <stdio.h>
#include <cuda_runtime.h>
#include <cuda.h>
#include <cutil.h>
当然还有其他几个c的头文件,应该不缺吧


chinecuda 2009-08-21
  • 打赏
  • 举报
回复
另,你的工程文件是用CUDA_VS_Wizard建立的么?如果不是,也肯能是编译环境设定的问题
chinecuda 2009-08-21
  • 打赏
  • 举报
回复
1.可以,参看SDK中“matrixMul”sample.
// Declaration of the shared memory array As used to
// store the sub-matrix of A
__shared__ float As[BLOCK_SIZE][BLOCK_SIZE];

// Declaration of the shared memory array Bs used to
// store the sub-matrix of B
__shared__ float Bs[BLOCK_SIZE][BLOCK_SIZE];
2.缺少头文件

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧