Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA:“;堆栈溢出或断点命中;将字符数组从主机复制到设备后出现未指定的启动失败错误_C_Cuda_Stack Overflow_Unspecified Behavior - Fatal编程技术网

CUDA:“;堆栈溢出或断点命中;将字符数组从主机复制到设备后出现未指定的启动失败错误

CUDA:“;堆栈溢出或断点命中;将字符数组从主机复制到设备后出现未指定的启动失败错误,c,cuda,stack-overflow,unspecified-behavior,C,Cuda,Stack Overflow,Unspecified Behavior,我的主程序中有一个大的字符数组,我将它分块复制到设备上 记忆。我在程序中运行大约500000个线程,每个线程访问2000个字符。 所以我用代码一次传输500000*2000=1GB字节 err = cudaMemcpy (dev_database, adjusted_database[k], JOBS * 2000 * sizeof(char), cudaMemcpyHostToDevice); if(err != cudaSuccess) { printf("CUDA error: %s\n"

我的主程序中有一个大的字符数组,我将它分块复制到设备上 记忆。我在程序中运行大约500000个线程,每个线程访问2000个字符。 所以我用代码一次传输500000*2000=1GB字节

err = cudaMemcpy (dev_database, adjusted_database[k], JOBS * 2000 * sizeof(char), cudaMemcpyHostToDevice);
if(err != cudaSuccess) { printf("CUDA error: %s\n", cudaGetErrorString(err)); exit(EXIT_FAILURE); }
在我的内核中,我还定义了三个共享数组

//__shared__ char dev_query[200];
__shared__ float dev_scores[200*5];
__shared__ int dev_index[26];
并用

if(threadIdx.x == 0) { 
  //for(i = 0; i < 200; i++){ dev_query[i] = dev_query_constant[i]; }
  for(i = 0; i < 200 * 5; i++){ dev_scores[i] = dev_scores_constant[i]; }
  for(i = 0; i < 26; i++){ dev_index[i] = dev_index_constant[i]; }
}
__syncthreads(); 

下面的部分使用
k
而不初始化它:

ch = database[p + id];
score += dev_scores[k + dev_index[ch - 'A']];
这是无关的,但这一部分:

if(threadIdx.x == 0) { 
  //for(i = 0; i < 200; i++){ dev_query[i] = dev_query_constant[i]; }
  for(i = 0; i < 200 * 5; i++){ dev_scores[i] = dev_scores_constant[i]; }
  for(i = 0; i < 26; i++){ dev_index[i] = dev_index_constant[i]; }
}
if(threadIdx.x==0){
//对于(i=0;i<200;i++){dev_query[i]=dev_query_常量[i]}
对于(i=0;i<200*5;i++){dev_分数[i]=dev_分数常数[i]}
对于(i=0;i<26;i++){dev_index[i]=dev_index_常量[i]}
}
可以更改为以下内容:

if(threadIdx.x < 200) {
  // dev_query[i] = dev_query_constant[i];
}

if(threadIdx.x < 200 * 5) { // or iterate whole block 5 times..
  dev_scores[i] = dev_scores_constant[i];
}
...
if(threadIdx.x<200){
//dev_query[i]=dev_query_常量[i];
}
如果(threadIdx.x<200*5){//或迭代整个块5次。。
偏差分数[i]=偏差分数常数[i];
}
...

数据中有一些字符导致
dev_index[ch-'A']
返回-1。这 当k=0时,将
dev_得分的索引设置为-1。我相信这就是问题的根源
我的代码内存错误。我对所有内容都进行了注释,并以增量方式对未注释部分进行了注释。

现在很好用。感谢@talonmies、@harrism和@perreal的评论

内核的其余部分做什么?你在用递归吗?我没有用递归。代码的其余部分是for循环。我将在这篇评论之后在这里发布一些。我的问题现在有我的内核代码。我从主机将一个字符数组复制到设备内存后,从主程序调用它。在web浏览器中要调试的代码太多了。我建议您使用旧技术,将其全部注释掉、运行、稍微取消注释、再次运行等,直到您缩小原因。开始时,您注释掉了定义
I
的循环,然后使用
I
未初始化。这是粘贴代码的问题还是错误?我没有想到这一点。它很聪明。谢谢。k是一个我现在已经改正的错误。它应该是(j_-1)*5,而不是k。
if(threadIdx.x < 200) {
  // dev_query[i] = dev_query_constant[i];
}

if(threadIdx.x < 200 * 5) { // or iterate whole block 5 times..
  dev_scores[i] = dev_scores_constant[i];
}
...