CUDA中的原子操作次数是不是有限制

我要对一个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;

我再重复最后一遍,你到底看不看我给你的回复???你不能这样连续的无视人吧!

请安装CUDA 5.5, 然后从开始菜单中找到nsight monitor(请看清楚每个字样!)

并用鼠标左键点击一下,启动它。(使用鼠标的左键点!)

然后从任务栏的通知区域的右下角的找到nsight monitor图标,
并右键单击——Options——General——Microsoft Display Driver——WDDM TRD enabled 设为 True。将WDDM TDR Delay设置为例如6000。(请看清楚每一步)

我不想再重复第三遍,请尊重我的劳动。

Fermi不支持CUDA 5.0?!
我怀疑我是不是穿越了,长期使用fermi核心的显卡配合CUDA 5.0的路过。

这都是神马QQ群的奇葩言论,你们让NV情何以堪啊!

版主,实在是不好意思,我在开始菜单中没有找到nsight monitor,今天搜索nsight看到一个Nsight.Monitor.exe,运行这个,按照您的说法已经设置成功,谢谢。

设置成功后继续运行我的代码,结果黑屏,“显示器驱动程序已经停止,并且已经恢复”,是不是300300循环的原子加有问题,还是仅仅设置grid是11的这种情况可以,大一点就不行

后来想到你说的这些操作好像在改注册表,于是我重启电脑,然后再运行,现在可以了,多谢,麻烦你了

LZ您好:

这个确实要重启一下电脑才可以的,前面忘记强调了。

祝您好运~