我要对一个40亿的输入得到一个300*300的输出,所有输入作用的叠加(不能漏)得到输出,所以我在kernal函数中用了原子加操作
以一个简单的例子来描述我的问题
编了一个程序,对线程设置为
dim3 dimBlock( 32, 32, 1);
dim3 dimGrid( 256,256, 1);
然后写了一个内核函数,这个内核函数什么都不作,就对显存中的一个数循环执行原子加
主机端调用kernal
Contrast_Kernel<<<dimGrid,dimBlock>>>(d_idata;d_odata);
然后是设备端的kernal函数
global void
Contrast_Kernel( float* g_idata,float* g_odata)
{
for(unsigned int kx=0;kx<300;kx++)
{
for(unsigned int ky=0;ky<300;ky++)
{
……
temp=temp=3.14159265*(xixi+yiyi)/0.0496e-9/0.8+3.14159265*((xi-xo)(xi-xo)+(yi-yo)(yi-yo))/0.0496e-9/0.8+pha;
atomicAdd(&g_odata[ky*300+kx],temp);//请大家重点关注这句话。大家测试时,可以用一个常数替换temp试试
}
}
现在问题来了,编译通过后运行,显示器黑屏,然后恢复。程序总是提示:内存位置 0x0012f0b0 处的 cudaError_enum。
后来发现,只有设置dim3 dimGrid( 1,1, 1);时,程序才能成功运行。如果把原子操作换成简单的求和操作,也能正常运行,但是我这样就无法保证所有的输入作用都加上了,如果谁能不用原子操作解决这个问题,也是解决了我的问题,多谢。
是不是原子操作有次数限制?
—EDIT:
去掉了您题目中的opencl字样,因为这不是个opencl的问题。
对了,运行出错前,显示屏先黑屏了一下,然后提示“……显示恢复”
(1) VC提示某位置出现cudaError_enum请您无视,一切错误请以返回的错误和cudaGetLastError()为准。(VC的最有可能的异常之类的请您无视,那个可能被内部处理并作为错误代码返回,请以这个为准来确定您的错误值是什么)
(2)原子操作的没有次数限制。
以及,您缺乏基本概念,本文就不评论了,建议您先看看手册,避免无辜浪费时间、磨损您的键盘发帖。
以及,以后发帖建议您直接描述您要干嘛。
而不是直接就着您的代码让人评论,版主们的超能力很弱,从您的代码逆推您的问题很吃力,同时能逆推成功还得您的代码符合您的问题的本意。
建议以后直接点,对你我都好,您觉得呢?
谢谢,那我以一个简单的例子来描述我的问题
编了一个程序,对线程设置为
dim3 dimBlock( 32, 32, 1);
dim3 dimGrid( 256,256, 1);
然后写了一个内核函数,这个内核函数什么都不作,就对显存中的一个数循环执行原子加
主机端调用kernal
Contrast_Kernel<<<dimGrid,dimBlock>>>(d_idata;d_odata);
然后是设备端的kernal函数
global void
Contrast_Kernel( float* g_idata,float* g_odata)
{
for(unsigned int kx=0;kx<300;kx++)
{
for(unsigned int ky=0;ky<300;ky++)
{
atomicAdd(&g_odata[0],1);
}
}
现在问题来了,编译通过后运行,显示器黑屏,然后恢复。程序总是提示:内存位置 0x0012f0b0 处的 cudaError_enum。
后来发现,只有设置dim3 dimGrid( 1,1, 1);时,程序才能成功运行。如果把原子操作换成简单的求和操作,也能正常运行
请问这个是怎么回事,是不是原子操作有次数限制?
前文我都说过一次了,
“请无视某某位置的cudaError_enum”,而是检查错误代码。
您这问题这样当然抓不到头脑了,实际上如果您直接:
cudaError_t code = cudaDeviceSynchronize();
您会得到cudaErrorLaunchTimeout的。
这远比神马“某某位置的cudaError_enum”要清晰的多。
为何楼主您死活不听建议呢????
您听建议您已经早就发现此cudaErrorLaunchTimeout提示了。
那么如何解决此问题?
请安装CUDA 5.5, 然后从开始菜单中找到nsight monitor, 并用鼠标左键点击一下,启动它。
然后从任务栏的通知区域的右下角的找到nsight monitor图标并右键单击——Options——General——Microsoft Display Driver——WDDM TRD enabled 设为 True,同时将WDDM TDR Delay设置为例如6000。这个时间一般够用了(100分钟)。
建议楼主下次能看我发的楼层。
非常感谢您,版主大大
可能我的问题还是不好解决,我刚才问群里的人,他们说我的显卡是Geforce GTX 580,是费米核心,不支持5.0:'(
您可以选择听从论坛的建议,立刻安装CUDA 5.5的。
您也可以选择听从"QQ群"的建议,不安装的。
论坛只是提供建议,选择权在您。
感谢您的莅临。
谢谢你,我装了cuda5.5,打开NVIDA nsight HUD Launcher 3.1,右键弹出NVIDA nsight options,Options——General都有,但是后面只有一个debug,下面只有Injectiong DLL debuging enabled false/true;以及Launcher debuging enabled false/true;
system
10
我再重复最后一遍,你到底看不看我给你的回复???你不能这样连续的无视人吧!
请安装CUDA 5.5, 然后从开始菜单中找到nsight monitor(请看清楚每个字样!)
并用鼠标左键点击一下,启动它。(使用鼠标的左键点!)
然后从任务栏的通知区域的右下角的找到nsight monitor图标,
并右键单击——Options——General——Microsoft Display Driver——WDDM TRD enabled 设为 True。将WDDM TDR Delay设置为例如6000。(请看清楚每一步)
我不想再重复第三遍,请尊重我的劳动。
system
11
Fermi不支持CUDA 5.0?!
我怀疑我是不是穿越了,长期使用fermi核心的显卡配合CUDA 5.0的路过。
这都是神马QQ群的奇葩言论,你们让NV情何以堪啊!
system
12
版主,实在是不好意思,我在开始菜单中没有找到nsight monitor,今天搜索nsight看到一个Nsight.Monitor.exe,运行这个,按照您的说法已经设置成功,谢谢。
system
13
设置成功后继续运行我的代码,结果黑屏,“显示器驱动程序已经停止,并且已经恢复”,是不是300300循环的原子加有问题,还是仅仅设置grid是11的这种情况可以,大一点就不行
后来想到你说的这些操作好像在改注册表,于是我重启电脑,然后再运行,现在可以了,多谢,麻烦你了