昨天遇到一个奇怪的问题,来这里求助下。。
大概问题如下:
grid(1,2)
thread(32,1)
t_data为32x8的int数组,在host端memset初始化为0,然后copy到device端
kernel函数部分:
int i = threadIdx.x;
//取值0-31
int j = blockIdx.y;
//取值0,1
shared int cbf[32*4];
然后下面这段代码,我的意思是第一个block数据不作处理,其后的每个block数据与t_data数组的数据做位或操作
if(j!=0)
{
cbf[i]|=t_data[i+(j-1)*32];
}
结果发现上面这段代码完全没有作用,cbf的值根本没有变化,
但是我把t_data数组的值传回host端,打印出来的数值为1,16,8,0。。。
证明t_data是有值的。。也就是cbf的值应该变化。。
然后我又尝试把t_data的值直接初始化为打印出来的数值,这次cbf的值变化了。。
所以很奇怪,为什么有数值的话,会出现这种情况呢?
麻烦大家了,先谢过了。。
代码如下
[ 本帖最后由 wscuiqiu 于 2010-12-3 11:00 编辑 ]
完全没看懂如下两行代码是什么意思:
[
楼主什么意思???
额,不好意思,这个编辑问题有点不熟,现在应该清楚点了。。
shared int cbf[32*4];
这个是说cbf是shared_mem
cbf[i] |=t_data[i+(j-1)*32];
这是个shared_mem和global_mem对应元素的位或操作。。
这个是部分代码。。
[ 本帖最后由 wscuiqiu 于 2010-12-3 10:28 编辑 ]
知名外企急招JAVA人才:base上海
Staff Unix Engineer
8年以上相关经验,有Perl,Python和UNIX的Shll脚本语言开发经验,英文流利。
Senior Web Developer–StubHub CDC
5-8年需求分析,设计,编程,测试相关经验,精通Web框架,如:(Spring MVC, GWT, Tapestry),英文流利。
Senior Software Engineer --SWAT
5年以上软件应用开发经验,对JAVA,Oracle,SQL,Unix或者Linux有丰富的经验,使用Tapestry 5经验者优先。英文流利。
Staff Software Engineer–StubHub CDC
8年以上需求分析,设计,编程,测试相关经验,熟悉JAVA J2EE的设计和应用开发经验,包括Spring, Hibernate, AJAX, jQuery, servlets, JSP, Java Beans, JDBC. Knowledge of XML, XSL, CSS, JavaScript, and HTML required. 英文流利,详细请看JD。
Staff Software Engineer–搜索引擎
MSN:susan-1013@hotmail.com
QQ:1521017946
[
这位姊妹, 好多问题,
(1)首先有个大问题:
你的j是blockIdx.y, 同时你只有两个blocks(因为你说了你的grid shape为{1,2,1}), 所以, 相当于:
if(是第一个block中的线程) 赋值
if(是第二个block中的线程) 执行按位或运算.
实际上这两个block并不是一个一个的顺序执行的. 所以不等你第一个block执行完赋值…后面第二个block已经开始运算了…
多谢 悠闲的小猫
我还想怎么可能会出现这种情况呢。。
想法太naive了。。
额,那再麻烦问下,对于这种情况,一般怎么处理比较好呢?
拆成两个kernel函数?
[
哪种情况? 两个block, 一个赋值? 一个运算?
额…还是拆成2个kernel比较好…