我试图通过使用常量参数但获得错误来分配共享内存.我的内核看起来像这样:
__global__ void Kernel(const int count)
{
__shared__ int a[count];
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误说
错误:表达式必须具有常量值
伯爵是常量!为什么我收到此错误?我怎么能绕过这个?
我有2个非常相似的内核函数,在某种意义上代码几乎相同,但略有不同.目前我有2个选择:
if语句对我的算法性能有多大影响?
我知道没有分支,因为所有块中的所有线程都将输入if或else.
如果内核函数被多次调用,那么单个if语句会降低我的性能吗?
我有以下代码:
int **ptr = (int **)malloc(sizeof(int*)*N);
for(int i=0;i<N;i++)
ptr[i]=(int*)malloc(sizeof(int)*N));
Run Code Online (Sandbox Code Playgroud)
我怎样才能免费使用ptr free?我应该循环ptr和free ptr [i]吗?或者只是做
free(ptr)
Run Code Online (Sandbox Code Playgroud)
和ptr将被释放?
我有几个块,每个块都有一个大小为512的共享内存数组中的整数.如何检查每个块中的数组是否包含零作为元素?
我正在做的是创建一个驻留在全局内存中的数组.此数组的大小取决于块的数量,并初始化为0.因此,a[blockid] = 1如果共享内存数组包含零,则每个块都会写入.
我的问题是当我在一个块中同时写几个线程时.也就是说,如果共享内存中的数组包含多个零,则会写入多个线程a[blockid] = 1.这会产生任何问题吗?
换句话说,如果2个线程将完全相同的值写入全局内存中完全相同的数组元素,那会不会有问题?
我有以下信息:
Maximum number of threads per block: 512
Maximum sizes of each dimension of a block: 512 x 512 x 64
Run Code Online (Sandbox Code Playgroud)
这是否意味着2d线程块中的最大线程数是512x512,这给了我每个块中262144个线程?
如果是,那么在一个至少256个块的内核中拥有这么多线程是一个好习惯吗?
我有几个块,每个块在整数数组的单独部分上执行.例如:阻塞一个从数组[0]到数组[9],阻塞二从数组[10]到数组[20].
我可以获得每个块的数组最大值索引的最佳方法是什么?
示例块a a [0]到[10]具有以下值:
5 10 2 3 4 34 56 3 9 10
所以56是指数6的最大值.
我无法使用共享内存,因为数组的大小可能非常大.因此它不适合.是否有任何图书馆允许我这么快?
我知道减少算法,但我认为我的情况不同,因为我想得到最大元素的索引.
我正在使用NSight来调试我的CUDA代码,我有一个疑问:如何为特定的线程和块设置断点?
当我在内核上放置一个断点时,调试器总是在块0的线程0处停止.
我正在尝试使用c为2维数组分配内存,我在visual studio 2008中得到一个例外.
int Count=16383,N=14;
char **result=(char**)malloc(sizeof(char)*Count);
for(int i=1;i<=Count;i++)
result[i] = (char*)malloc(sizeof(char)*N);
Unhandled exception at 0x012e1692 in combination.exe: 0xC0000005:
Access violation writing location 0x00590000
Run Code Online (Sandbox Code Playgroud)
当我是11272并且我无法理解为什么时会发生异常!