内存使用错误求解?

错误信息:
src/md5_gpu.cu(51): Error: Unaligned memory accesses not supported
make: *** [obj/x86_64/debug/md5_gpu.cu.o] 错误 2

部分代码:

global void kernel(uint32 *in_data, GPUResult *result)
{
//明文赋值部分
uint32 block0,block1,block2,block3,
block4,block5,block6,block7,
block8,block9,block10,block11,
block12,block13,block14,block15;
//循环体外先初始化
clear_block();
//根据不同明文长度填充信息
read_plaintext(d_plain_len[0]);
block14=d_plain_len[0]<<3;

char ori_word[32]={0};
char transformed_buf[32]={0}; //51行 这一行错误
uint32 plaintext[13];
char *plain;
uint32 word_begin,word_finsh;
word_begin = d_offset[0]&0xff00;
word_finsh = d_offset[0]&0xff;
int *trans_plain;

}

这个错误是为什么呢?求大神解答!!!!!

read_plaintext(d_plain_len[0]);
你的函数似乎参数列表中并未有d_plain_len

楼主!unaligned memory access会在编译的时候和运行的时候报错!

你的编译器能给你检查出来的!就是你的幸运!检查不出来的!你运行就是cudaErrorUnknown! 明白?!

这是对你这个错误提示的解释!

至于你指定的51行说有问题!我看没问题!可能是我眼瞎了!

你再找找!其他人也欢迎继续帮他!

我只是贴部分代码,那个我在常数存储器声明啦!没有错误,编译的时候显示51行内存错误!我在仔细的看下代码,是不是后面写错误啦

是不是有可能我在后面用这个数组发生错误,但编译器检查时只提示我这个数组有错误?只能细细的先看下后面的代码。然后过会试试常数存储器跑下行不行!老天保佑

[

如果在常数内存那就没问题了,不过这种错误一般都是内存使用出错了,所以LZ还得仔细找找看看是不是哪里访问出错!
当然还有一个会导致这个问题出现的就是同步问题!你看看是不是有多个线程同时在对某个地址进行写操作。。

建议检查下详细的代码看看有没有把类型写错的,比如原本是char的误为int,导致int的起始地址不是4字节对齐的。

想问下在常数存储器存储的值是不是不能再被修改,因为它是只读的,如果在内核修改的话会不会引起内存错误?

是不能改的,但是我觉得不会报这个非对齐访问的错误,个人意见,仅供参考。

解决啦,字对齐加__align__(4),强制转换的时候错啦!!!::smiley:

恭喜楼主。

下次建议发完整代码。