有没有办法让内核根据数据大小使用常量或全局内存 \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); }
我想做如上所述的事情,但我发现内核并没有得到正确的缓冲区。有没有办法做到这一点?如果可能的话,我不想在内核中添加“if”条件,最好的解决方案是有一个有没有办法让内核根据数据大小使用常量或全局内存 \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
\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):
}
}