|
楼主 |
发表于 2005-7-19 22:00
|
显示全部楼层
重复流 <BR>重复流是一种特殊类型的流,它预先就被初始化为一系列顺序的值(1,2,3,4,...)。创建一个重复流使用iter关键字和运算符: <BR>iter float s<100> = iter(0.0f, 100.0f); <BR>// s被初始化成0.0, 1.0, 2.0, ..., 99.0 <BR>iter操作符的第一个参数通常是流的初始值。第二个操作符是流的数值的上限,产生完全相同的形式【初始值,上限】。流元素之间的步长等于(初始值-上限)/流中元素的个数。 <BR>iter float s<100> = iter(0.0, 1.0f); <BR>// s: 0.00, 0.01, 0.02, 0.03, ..., 0.99 <BR><BR>iter float s<10> = iter(2.0f, 7.0f); <BR>// s: 2.0, 2.5, 3.0, 3.5, ..., 6.5 <BR>一维重复流也同时与float2,float3,float4类型一起使用。每一个元素都被单独的插值。 <BR><BR>iter float2 s<10> = iter(float2(0, 0), float2(10, 5)); <BR>// s: (0,0), (1,0.5), (2,1), ..., (9,4.5)。 <BR>目前的编译器只支持一维和二维的重复流。如果流是二维的,流元素的类型必须是float2。在二维的情况下,插值稍稍有些不同。 <BR><BR>iter float2 s<4, 4> = iter (float2(0,0), float2(4, 10)) <BR>s: <BR>(0, 0) (1, 0) (2, 0) (3, 0) <BR>(0, 2.5) (1, 2.5) (2, 2.5) (3, 2.5) <BR>(0, 5) (1, 5) (2, 5) (3, 5) <BR>(0, 7.5) (1, 7.5) (2, 7.5) (3, 7.5) <BR>流元素的每一个部分都会根据相应维数的最大和最小值进行插值。 <BR>目前Brookgpu编译器和运行不支持二维以上的重复流,更进一步地说,如果一个重复流传递进入一个kernel,它的维数必须和输出流的维数相匹配。这些限制可能会在将来发行的版本中取消,目前重复流和数据流并不相同,因此,重复流的参数中必须包含iter这个关键字,而且将重复流做为一个输出结果传进kernel也是不允许的。这些限制可能会在将来发行的版本中改变。 <BR>ScatterOp <BR>streamScatterOp(s, index_stream, array,STREAM_SCATTER_ASSIGN); <BR><BR>StreamScatterop运算符执行一个间接的写操作,流s中包含传递给Scatter的数据,索引流(index Stream)中包含在数组中要写入数据的偏移量。第四个参数是执行如下的操作:将新来的数据同已经保存在数组中的数据结合起来,这个参数可以是一个约简函数,或是枚举函数的一个组成部分,例如STREAM_SCATTER_ASSIGN执行一个将流数据直接写入数组的写操作。 <BR><BR>GatherOp <BR>streamGatherOp(t, index_stream, array, STREAM_GATHER_FETCH); <BR><BR>streamGatherOp执行一个数组上间接的读操作。它通过使用索引流来生成一个取值的流(t)。如果数组是多维的,索引流提供一个在数组内的线性偏移(基于C语言数组的列优先排列)。 <BR>第四个参数可以是任何kernel函数,这个函数包含一个单独的输出流或是一个预定义的操作符。STREAM_GATHER_FETCH参数指出Gather操作仅仅读取值并将这个值放入流中就行了。 <BR> |
|