(1)常量内存的使用是先声明__constant__变量,然后使用cudaMemcpyToSymbol()设置常量,之后就可以在核函数中使用了,但最好是所有线程都访问相同的地址,而硬件装置会将该地址中的数据每次广播到半个线程束(16个线程)中。(2)常量内存的访问方式是直接用数组访问。
(3)常量内存不可以被修改。
不知对于常量内存我这样的理解是否全面?
但对于纹理内存,我觉得它是可以被修改的,只不过是可以修改它的绑定内存缓冲区,比如:
global void BlendKernel(float* outSrc,const float* inSrc)
{
int x=threadIdx.x+blockIdx.xblockDim.x;
int y=threadIdx.y+blockIdx.yblockDim.y;
int offset=x+yblockDim.xgridDim.x;
int top,bottom,left,right;
top=offset-DIM;
bottom=offset+DIM;
left=offset-1;
right=offset+1;
if (y==0)
{
top+=DIM;
}
if (y==(DIM-1))
{
bottom-=DIM;
}
if (x==0)
{
++left;
}
if (x==(DIM-1))
{
--right;
}
float t,b,l,r,c;
t=tex1Dfetch(textIn,top);
b=tex1Dfetch(textIn,bottom);
l=tex1Dfetch(textIn,left);
r=tex1Dfetch(textIn,right);
c=tex1Dfetch(textIn,offset);
outSrc[offset]=c+SPEED*(t+b+l+r-4*c);
return;
}
void AnimGpu(DataBlock* db,int ticks)
{
float elapsedTimes;
cudaEventRecord(db->start,0);
dim3 blocks(DIM/16,DIM/16);
dim3 threads(16,16);
CPUAnimBitmap* bitmap=db->bitmap;
for (int i=0;i<90;++i)
{
CopyConstKernel<<<blocks,threads>>>(db->dev_inSrc);
BlendKernel<<<blocks,threads>>>(db->dev_outSrc,db->dev_inSrc);
swap(db->dev_inSrc,db->dev_outSrc);
}
float_to_color<<<blocks,threads>>>(db->output_bitmap,db->dev_inSrc);
cudaMemcpy(bitmap->get_ptr(),db->output_bitmap,bitmap->image_size(),cudaMemcpyDeviceToHost);
cudaEventRecord(db->stop,0);
cudaEventSynchronize(db->stop);
cudaEventElapsedTime(&elapsedTimes,db->start,db->stop);
db->totolTime+=elapsedTimes;
++db->frames;
return;
}
不知这种理解对不对?