有没有办法让内核根据数据大小使用常量或全局内存 \uuuuu常量\uuuuuu浮点常量[MAXSIZE] __装置uuuu浮动*d_buf; __全局无效 简单(浮点*buf2){ //访问buf2; } main(){ int大小,asize; 浮点数*abuf,*d_buf2,*h_buf; //... 如果(大小>最大大小){ 库达马洛克(亚洲d_buf2); cudaMemcpy(d_buf2,h_buf,asize); cudaMemcpyToSymbol(d_buf,&d_buf2,sizeof(d_buf2)); CUDAGETSYMBOL地址((无效**)和阿布夫,迪布夫); }否则{ cudaMemcpyToSymbol(constbuf、h_buf、asize); cudaGetSymbolAddress((无效**)和abuf,constbuf); } 简单(abuf); }

有没有办法让内核根据数据大小使用常量或全局内存 \uuuuu常量\uuuuuu浮点常量[MAXSIZE] __装置uuuu浮动*d_buf; __全局无效 简单(浮点*buf2){ //访问buf2; } main(){ int大小,asize; 浮点数*abuf,*d_buf2,*h_buf; //... 如果(大小>最大大小){ 库达马洛克(亚洲d_buf2); cudaMemcpy(d_buf2,h_buf,asize); cudaMemcpyToSymbol(d_buf,&d_buf2,sizeof(d_buf2)); CUDAGETSYMBOL地址((无效**)和阿布夫,迪布夫); }否则{ cudaMemcpyToSymbol(constbuf、h_buf、asize); cudaGetSymbolAddress((无效**)和abuf,constbuf); } 简单(abuf); },cuda,Cuda,我想做如上所述的事情,但我发现内核并没有得到正确的缓冲区。有没有办法做到这一点?如果可能的话,我不想在内核中添加“if”条件,最好的解决方案是有一个\uuuu设备\uuuu内核来完成大部分工作,还有两个\uu全局\uuuuuu内核来包装\uu设备\uuuu内核 例如: __constant__ float constbuf[MAXSIZE] __device__ float *d_buf; __global__ void simple (float *buf2){ //access

我想做如上所述的事情,但我发现内核并没有得到正确的缓冲区。有没有办法做到这一点?如果可能的话,我不想在内核中添加“if”条件,最好的解决方案是有一个
\uuuu设备\uuuu
内核来完成大部分工作,还有两个
\uu全局\uuuuuu
内核来包装
\uu设备\uuuu
内核

例如:

__constant__  float constbuf[MAXSIZE] 
__device__ float *d_buf;

__global__ void
simple (float *buf2){
   //access buf2;
}


main(){

   int size, asize;
   float *abuf, *d_buf2, *h_buf;
   //...
   if(size > MAXSIZE){
      cudaMalloc(&d_buf2, asize);
      cudaMemcpy(d_buf2, h_buf, asize);   
      cudaMemcpyToSymbol(d_buf, &d_buf2, sizeof(d_buf2));
      cudaGetSymbolAddress((void **) &abuf, d_buf);
   }else{
      cudaMemcpyToSymbol(constbuf, h_buf, asize);
      cudaGetSymbolAddress((void **) &abuf, constbuf); 
   } 

   simple<<<grid, block, 0 ,stream>>>(abuf);


}
\uuuu常量\uuuu buf[MAXSIZE];
__设备简单内核(浮点*buf,整数)
{
//在这里做点什么。
}
__全局\简单\全局\内存(float*d\ buf,int len)
{
简单内核(d_buf,len);
}
__全局简单常量内存(整数)
{
简单内核(c_buf,len);
}
int main()
{
//其他代码
if(len
谢谢您的回复。如果没有更简单的解决方案,我想我必须这样做
__constant__ c_buf[MAXSIZE];

__device__ simple_core(float *buf, int len)
{
 // do something here.
}


__global__ simple_global_mem(float *d_buf, int len)
{
    simple_core(d_buf, len);
}


__global__ simple_const_mem(int len)
{
    simple_core(c_buf, len);
}

int main()
{
 // other code

if (len < MAXSIZE) {
    // cuda memcpy to symbol code here
    simple_const_mem<<<threads, blocks>>>(len);
}
else {
    simple_global_mem<<<threads, blocks>>>(d_buf, len):
}
}