求助:运行《cuda for Engineers》的dd_ld_shared案例一直出错?求指导

lugui2009 2019-03-22 04:26:05

在学习cuda的时候,运行了《CUDA for Engineers an Introduction to High-Performance Parallel Computing》的dd_ld_shared这个案例时,一直出错,这个案例主要是输入一个一维数组,然后每个数组值取其前后两值做个加加减减的运算,然后输出打印,发现打印的值都是初始值,说明这个核没有运行过。然后我在每个cuda函数加了各check_error的函数,发现运行到从显存写出数据到内存的时候,说是非法的内存访问(illeage memory之类的),那么也间接说明了那个核根本没有运算。这个案例用到了动态申请共享内存。所有代码如下:


#include <math.h>
#include <stdio.h>

static void HandleError( cudaError_t err,
const char *file,
int line ) {
if (err != cudaSuccess) {
printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
file, line );
exit( EXIT_FAILURE );
}
}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))

#define TPB 64
#define RAD 1

__global__ void ddKernel(float *d_out, const float *d_in, int size, float h) {
const int i = threadIdx.x + blockDim.x * blockIdx.x;
if (i >= size) return;

const int s_idx = threadIdx.x + RAD;
extern __shared__ float s_in[];

// Regular cells
s_in[s_idx] = d_in[i];

// Halo cells
if (threadIdx.x < RAD) {
// careful: the two lines below will also access d_in[-1] and d_in[size+1] which
// are undefined! This bug is fixed in heat_2d (cf. idxClip function)
s_in[s_idx - RAD] = d_in[i - RAD];
s_in[s_idx + blockDim.x] = d_in[i + blockDim.x];
}
__syncthreads();
d_out[i] = (s_in[s_idx-1] - 2.f*s_in[s_idx] + s_in[s_idx+1])/(h*h);
}

int main(){
const float PI = 3.1415927;
const int N = 150;
const float h = 2*PI/N;

float x[N] = {0.0};
float u[N] = {0.0};
float result_parallel[N] = {0.0};

for(int i=0;i<N;i++)
{
x[i] = 2*PI*i/N;
u[i] = sinf(x[i]);
}

float *d_in = 0;
float *d_out = 0;
HANDLE_ERROR(cudaMalloc(&d_in,N*sizeof(float)));
HANDLE_ERROR(cudaMalloc(&d_out,N*sizeof(float)));
HANDLE_ERROR(cudaMemcpy(d_in,&u[0],N*sizeof(float),cudaMemcpyHostToDevice));

const size_t smemSize = (TPB+2*RAD)*sizeof(float);

ddKernel<<<(N+TPB-1)/TPB,TPB,smemSize>>>(d_out,d_in,N,h);

HANDLE_ERROR(cudaMemcpy(result_parallel,d_out,N*sizeof(float),cudaMemcpyDeviceToHost));

HANDLE_ERROR(cudaFree(d_in));
HANDLE_ERROR(cudaFree(d_out));

FILE *outfile = fopen("results.csv", "w");
for (int i = 1; i < N - 1; ++i) {
fprintf(outfile, "%f,%f,%f,%f\n", x[i], u[i],
result_parallel[i], result_parallel[i] + u[i]);
}
fclose(outfile);

}


我用的显卡RTX2080,TITTAN V都试过,CUDA版本9.1和10.1试过。我想是不是新的显卡或者cuda将什么功能给改变了什么,望高手能指导一下,谢谢。
...全文
610 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjsjason 2019-03-23
  • 打赏
  • 举报
回复
你的核函数里面不是有一行注释吗“ // careful: ***”,关注一下
pstrunner 2019-03-23
  • 打赏
  • 举报
回复
const int s_idx = threadIdx.x + RAD;// 有没有可能为零 如果为0, 则s_in[s_idx-1]就会出现越界
wjsjason 2019-03-22
  • 打赏
  • 举报
回复
非法内存访问这个错误可能是核函数报出来的,只是在别处被你检测到了而已。导致非法内存访问的原因一般都是由于访问全局内存或者共享内存的index超出界限了,所以你可以检查一下核函数里index的计算是否正确
源码直接下载地址: https://pan.quark.cn/s/387d7c8f6289 在使用IE浏览器的过程中,偶尔会出现重置为默认配置操作未能顺利完成的现象。这种情况的发生可能源于多种因素,包括注册表项出现偏差、浏览器附加组件之间存在不兼容、操作系统授权设置不当或受到恶意程序影响等。针对这一挑战,我们可以通过一系列系统性的方法来逐一诊断和纠正。首先需要验证当前用户是否具备管理员级别的操作权限。在执行重置配置的操作时,必须确保IE浏览器是以管理员身份启动的。具体操作方式为,使用鼠标右键单击IE程序图标,并从弹出的菜单中选择“以管理员身份运行”这一选项。其次,应当检查是否存在恶意软件。恶意程序有时会非法修改浏览器的配置信息,从而阻碍重置过程的正常进行。用户可以借助Windows系统自带的Microsoft Safety Scanner进行检测,或者选择安装并使用第三方安全防护软件执行全面的系统扫描。紧接着,需要对浏览器的缓存数据以及Cookies文件进行清理。在IE浏览器界面中,通过访问“工具”菜单并选择“Internet选项”,然后在弹出的设置界面中,切换至“常规”标签页,并执行清除浏览历史记录的操作,此过程应包含Cookies和临时互联网文件。倘若上述步骤均未能解决问题,那么可以考虑禁用或移除那些可能引发冲突的浏览器附加组件。相关操作需要在“工具”菜单下找到并打开“管理加载项”,对可疑的插件进行禁用处理,并在浏览器重新启动后再次尝试执行重置操作。再者,修复IE浏览器相关的注册表配置也是至关重要的环节。注册表编辑器是一个功能强大的系统工具,任何不当的操作都可能导致严重的系统问题,因此在进行修改前必须创建系统还原点作为安全备份。用户可以通过按下“Win+R”组合...
内容概要:本文详细介绍了光伏储能虚拟同步发电机(VSG)并网仿真模型的Simulink实现方法,系统研究了光伏发电与储能系统融合VSG技术并入电网的动态特性与控制策略。通过构建完整的VSG控制模块,模拟其在并网过程中的虚拟惯性响应、频率调节能力和有功无功功率支撑特性,验证了该系统在增强电网稳定性、提升新能源并网适应性方面的有效性。模型全面涵盖光伏出力特性、储能系统充放电管理、VSG有功-无功解耦控制、下垂控制机制以及并网点动态响应等关键环节,并通过多种工况下的仿真分析,评估系统在不同运行条件下的动态性能与鲁棒性。; 适合人群:具备电力系统、新能源发电、自动控制等相关专业背景,熟悉Matlab/Simulink仿真环境,从事新能源并网、微电网控制或电力电子系统研究的科研人员、工程技术人员及研究生。; 使用场景及目标:①深入理解光伏储能系统如何通过VSG技术模拟同步发电机的惯性和阻尼特性以支持电网稳定;②掌握虚拟惯量控制、下垂控制等VSG核心控制策略在Simulink中的建模、参数设计与实现方法;③为新型电力系统中新能源并网的动态仿真、稳定性分析及控制策略优化提供可靠的模型基础和技术参考。; 阅读建议:建议结合所提供的仿真模型进行逐步操作与参数调试,重点关注VSG控制环路的结构设计、控制器参数整定及其对系统动态性能的影响,同时可将该模型拓展应用于多机并联、微电网孤岛/并网切换、多能源协同控制等更复杂的系统场景中进行进阶研究。

591

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧