gpt4 book ai didi

在输入数据中使用各种偏移量时 CUDA 内核启动失败

转载 作者:行者123 更新时间:2023-12-01 06:18:46 25 4
gpt4 key购买 nike

我的代码给出了一条错误消息,我正试图找出它的原因。为了更容易找到问题,我删除了显然与导致错误消息无关的代码。如果您能告诉我为什么以下简单代码会产生错误消息,那么我想我应该能够修复我的原始代码:

#include "cuComplex.h"
#include <cutil.h>

__device__ void compute_energy(void *data, int isample, int nsamples) {
cuDoubleComplex * const nminusarray = (cuDoubleComplex*)data;
cuDoubleComplex * const f = (cuDoubleComplex*)(nminusarray+101);
double * const abs_est_errorrow_all = (double*)(f+3);
double * const rel_est_errorrow_all = (double*)(abs_est_errorrow_all+nsamples*51);
int * const iid_all = (int*)(rel_est_errorrow_all+nsamples*51);
int * const iiu_all = (int*)(iid_all+nsamples*21);
int * const piv_all = (int*)(iiu_all+nsamples*21);
cuDoubleComplex * const energyrow_all = (cuDoubleComplex*)(piv_all+nsamples*12);
cuDoubleComplex * const refinedenergyrow_all = (cuDoubleComplex*)(energyrow_all+nsamples*51);
cuDoubleComplex * const btplus_all = (cuDoubleComplex*)(refinedenergyrow_all+nsamples*51);

cuDoubleComplex * const btplus = btplus_all+isample*21021;

btplus[0] = make_cuDoubleComplex(0.0, 0.0);
}

__global__ void computeLamHeight(void *data, int nlambda) {
compute_energy(data, blockIdx.x, nlambda);
}

int main(int argc, char *argv[]) {
void *device_data;

CUT_DEVICE_INIT(argc, argv);
CUDA_SAFE_CALL(cudaMalloc(&device_data, 184465640));
computeLamHeight<<<dim3(101, 1, 1), dim3(512, 1, 1), 45000>>>(device_data, 101);
CUDA_SAFE_CALL(cudaThreadSynchronize());
}

我使用的是 GeForce GTX 480,我正在这样编译代码:

nvcc -L /soft/cuda-sdk/4.0.17/C/lib -I /soft/cuda-sdk/4.0.17/C/common/inc -lcutil_x86_64 -arch sm_13 -O3 -Xopencc "-Wall" Main.cu

输出是:

Using device 0: GeForce GTX 480
Cuda error in file 'Main.cu' in line 31 : unspecified launch failure.

编辑:我现在进一步简化了代码。以下更简单的代码仍然会产生错误消息:

#include <cutil.h>

__global__ void compute_energy(void *data) {
*(double*)((int*)data+101) = 0.0;
}

int main(int argc, char *argv[]) {
void *device_data;

CUT_DEVICE_INIT(argc, argv);
CUDA_SAFE_CALL(cudaMalloc(&device_data, 101*sizeof(int)+sizeof(double)));
compute_energy<<<dim3(1, 1, 1), dim3(1, 1, 1)>>>(device_data);
CUDA_SAFE_CALL(cudaThreadSynchronize());
}

现在很容易看出偏移量应该是有效的。我尝试运行 cuda-memcheck 并显示以下内容:

========= CUDA-MEMCHECK
Using device 0: GeForce GTX 480
Cuda error in file 'Main.cu' in line 13 : unspecified launch failure.
========= Invalid __global__ write of size 8
========= at 0x00000020 in compute_energy
========= by thread (0,0,0) in block (0,0,0)
========= Address 0x200200194 is misaligned
=========
========= ERROR SUMMARY: 1 error

我尝试在互联网上搜索地址未对齐是什么意思,但没有找到解释。这是怎么回事?

最佳答案

很难用所有这些神奇常量解析您的原始代码,但是您更新的重现案例使问题立即显而易见。 GPU 架构要求所有指针都与字边界对齐。您的内核包含一个未正确字对齐的指针访问。 double 是 64 位类型,您的寻址未与偶数 64 位边界对齐。这:

*(double*)((int*)data+100) = 0.0; // 50th double

或者这个:

*(double*)((int*)data+102) = 0.0; // 51st double

都是合法的。这:

*(double*)((int*)data+101) = 0.0; // not aligned to a 64 bit boundary

不是。

关于在输入数据中使用各种偏移量时 CUDA 内核启动失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11820912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com