CUDA三环
我是CUDA的新手,我正在努力将一个C代码转换成CUDA C,它构建成功了,但一直崩溃。三环函数肯定是错误的,我不知道应该更改什么 函数调用:CUDA三环,c,for-loop,cuda,C,For Loop,Cuda,我是CUDA的新手,我正在努力将一个C代码转换成CUDA C,它构建成功了,但一直崩溃。三环函数肯定是错误的,我不知道应该更改什么 函数调用: for (z=0;z<=max;z++) { correlationsum=coefficient(x, n, dim, z); printf("result for epsilon %d returns %d\n", z, correlation_sum); } for(z=0;z所以“崩溃”是一
for (z=0;z<=max;z++)
{
correlationsum=coefficient(x, n, dim, z);
printf("result for epsilon %d returns %d\n", z, correlation_sum);
}
for(z=0;z所以“崩溃”是一个seg故障。seg故障是主机代码中的问题,而不是内核代码中的问题(尽管它可能在CUDA API的使用中)
您的代码有各种各样的问题
这可能会引起麻烦:
int x[40000]
这将创建一个基于堆栈的大型分配。相反,我建议执行动态分配:
int *x = (int *)malloc(40000*sizeof(int));
动态分配具有更高的大小限制
从您的内核使用情况可以清楚地看出,您打算使用整个x
向量。因此,设备上的dux
分配不正确:
cudaMalloc((void **)&d_x, sizeof(int));
我们在设备上需要与主机上相同的大小分配:
cudaMalloc((void **)&d_x, 40000*sizeof(int));
对应于2,您可能希望将整个x
向量复制到设备(因为您的代码没有显示x
的初始化,所以不太清楚),并且您在此处错误地获取了x
的地址,但x
已经是一个指针:
cudaMemcpy(d_x, &x, sizeof(int), cudaMemcpyHostToDevice);
所以我们想要这样的东西:
cudaMemcpy(d_x, x, 40000*sizeof(int), cudaMemcpyHostToDevice);
您的其他内核参数似乎是标量参数。您处理这些参数的方式也大多不正确:
__global__ void coefficient(int *vctr, int numberofpoints, int coefficient_row, int epsilon, int *numbofpairs){
对于像上面指定的numberofpoints
这样的参数(单向传递到函数),我们只需在调用内核时按值传递所需的主机数量,就像使用普通C函数一样。因此,此内核调用不正确(即使它看起来是编译的):
请注意,我没有对您的内核代码进行任何更改。您应该始终这样做。此外,您应该提供一个。欢迎这样做。尽管您在工作和这个问题上付出了一些努力,但您的代码中缺少了值。我们不知道循环的限制,也不知道线程的数量,如果有另一个内存分配可以ld使整个程序崩溃…你应该提供一个。当你开始使用CUDA时,在你的代码中添加适当的CUDA错误检查。如果你看到反对票,不要气馁。改进你的问题以获得好的和高质量的答案。谢谢你们,我已经编辑了我的帖子并提供了一个MCVE(如果我做对了,仍在学习英语)。很抱歉让我说不清楚。x是一个数字数组(从文件中读取),最多40000个。因此,我需要将整个数组传递给设备,内核调用将如何更改?内核调用根本不需要更改。通过d_x
传递的x
向量是完整传递的(所有40000个元素)对于内核,在我的代码中。好的,明白了。最后一件事是内核本身-j,j和k。j和k的值看起来根本没有变化,我猜blockId.x/y/z*blockDim.x/y/z+threadIdx.x/y/z不是正确的解决方案?是的,你正在启动一个一维网格和一维threadblock,所以j
和k
总是b由于我不知道你在内核中试图计算什么,我不能说什么是有意义的。崩溃问题已经解决了,对吗?如果你有新问题,我建议你问一些新问题。
cudaMemcpy(d_x, x, 40000*sizeof(int), cudaMemcpyHostToDevice);
__global__ void coefficient(int *vctr, int numberofpoints, int coefficient_row, int epsilon, int *numbofpairs){
coefficient << <1, THREADS >> >(d_x, *d_n, *d_dim, *d_z, d_numbofpairs);
coefficient << <1, THREADS >> >(d_x, n, dim, z, d_numbofpairs);
$ cat t724.cu
#include <stdio.h>
#define cudaCheckErrors(msg) \
do { \
cudaError_t __err = cudaGetLastError(); \
if (__err != cudaSuccess) { \
fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
msg, cudaGetErrorString(__err), \
__FILE__, __LINE__); \
fprintf(stderr, "*** FAILED - ABORTING\n"); \
exit(1); \
} \
} while (0)
#define THREADS 1024
__global__ void coefficient(int *vctr, int numberofpoints, int coefficient_row, int epsilon, int *numbofpairs){
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
int k = blockIdx.z * blockDim.z + threadIdx.z;
int sum;
numbofpairs = 0;
int sq_epsilon = epsilon*epsilon;
if (i <= numberofpoints - coefficient_row)
{
sum = 0;
if (j <= numberofpoints + 1 - coefficient_row)
{
if (k < coefficient_row)
sum = sum + (vctr[i + k] - vctr[j + k])*(vctr[i + k] - vctr[j + k]);
if (sum < sq_epsilon){
numbofpairs++;
sum = 0;
}}}}
int main()
{
int n, dim, max, z;
int *d_x, *d_numbofpairs;
int correlation_sum = 0;
int *x = (int *)malloc(40000*sizeof(int));
if (x == NULL) {printf("malloc fail\n"); return -1;}
n=10;
max=10;
dim=3;
cudaMalloc((void **)&d_x, sizeof(int));
cudaCheckErrors("cudaMalloc 1 fail");
cudaMalloc((void **)&d_numbofpairs, sizeof(int));
cudaCheckErrors("cudaMalloc 2 fail");
cudaMemcpy(d_x, x, sizeof(int), cudaMemcpyHostToDevice);
cudaCheckErrors("cudaMemcpy 1 fail");
for (z = 0; z <= max; z++)
{
coefficient << <1, THREADS >> >(d_x, n, dim, z, d_numbofpairs);
cudaMemcpy(&correlation_sum, d_numbofpairs, sizeof(int), cudaMemcpyDeviceToHost);
cudaCheckErrors("cudaMemcpy 2/kernel fail");
printf("result for epsilon %d returns %d\n", z, correlation_sum);
}
cudaFree(d_x);
cudaFree(d_numbofpairs);
return 0;
}
$ nvcc -o t724 t724.cu
$ ./t724
result for epsilon 0 returns 3
result for epsilon 1 returns 3
result for epsilon 2 returns 3
result for epsilon 3 returns 3
result for epsilon 4 returns 3
result for epsilon 5 returns 3
result for epsilon 6 returns 3
result for epsilon 7 returns 3
result for epsilon 8 returns 3
result for epsilon 9 returns 3
result for epsilon 10 returns 3
$