是函数没运行还是内存出错???新人求助??

我简单的谢了一个测试例子(数组想加) 但是输出确实有问题的 似乎函数没有运行 还是 内存出问题??
简单的代码:
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#define N 10

global void add(int* a, int* b, int *c)
{
int tid = threadIdx.x;
int tmp;
if (tid < N)
{
tmp = *(a+ tid) + *(b + tid) + 1;
*(c+ tid) = tmp;
}
}

int main(void)
{

int* a = (int *)malloc(N sizeof(int) );
int
b = (int *)malloc(N sizeof(int) );
int
c = (int *)malloc(N *sizeof(int) );

memset(a, 0, sizeof(int) *N);
memset(b, 0, sizeof(int) *N);
memset(c, 0, sizeof(int) *N);

int *dev_a;
int *dev_b;
int *dev_c;

cudaMalloc((void**)&dev_a, sizeof(int)* N);
cudaMalloc((void**)&dev_b, sizeof(int)* N);
cudaMalloc((void**)&dev_c, sizeof(int)* N);

cudaMemcpy(dev_a, a, sizeof(int)*N, cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, sizeof(int)*N, cudaMemcpyHostToDevice);
cudaMemcpy(dev_c, c, sizeof(int)*N, cudaMemcpyHostToDevice);
add<<<1,N>>>(a, b, c);

cudaMemcpy(a, dev_a, sizeof(int)*N, cudaMemcpyDeviceToHost);
cudaMemcpy(b, dev_b, sizeof(int)*N, cudaMemcpyDeviceToHost);
cudaMemcpy(c, dev_c, sizeof(int)*N, cudaMemcpyDeviceToHost);

FILE *fp;
fp = fopen(“text.txt”, “a+”);

for (int i = 0;i < N; i++)
{
fprintf(fp, “\n%d…%d…%d\n”, *a, *b, *c);
}

return 0;
}

忘了写了 这样的结果c数组一直是0 但是c数组不应该都是1吗??

您的代码的确有点问题:

您看,任何tid属于[0,n)的线程,都可以计算a[tid] + b[tid] + 1;

但是他们都写入一个位置: c[0]

那么究竟是那个线程写入了呢?
这个是不定的。(引用来源:cuda c/c++ programming guide)

所以最终您的多次运行,c[0]可能是任何一个结果。

你可以修改为c[tid] = tmp;来完成正确的“数组相加”。

刚才忘记说了。

之前代码贴错了 我改了 不好意思是

可以再帮我看看嘛 我之前的代码 改过来了 但是 C内任何的一个元素都是零 ?? 我是忘了啥吗?

嗯嗯。修正了就好。你还有3个错误。

(1)<<<>>>需要的是dev_a, dev_b, dev_c, 这里你写错了。
(2)你需要输出a[ i ], b[ i ] , c [ i ], 而不总是a[0],b[0],c[0]
(3)你还需要关闭文件(这个可以不修正,会自动关闭的)。

晕死 好吧 这错误太》。。。。谢了 我想问下 我写了一个并行的算法 里面的浮点数相乘的话 就会很费时间 我感觉很奇怪 而且常死掉… 浮点数相乘很没效率吗? 我机子的计算能力是1.1的G100的显卡

嗯嗯。恭喜楼主。

(1)G100的卡没有用过,但float乘法在任何卡上都是高效的(但是int乘法却不然)。
(2)效率和死机无关系的。低效!=死机。对吧。

:slight_smile:

嗯 谢谢了 我回去再查下是什么问题:lol:lol:lol 这个似乎不需要结贴?

之前的it168/itpub时代需要结贴的。现在不用了。这不,节省了您敲击好几次鼠标么,无需结贴可以大大延长您的鼠标的寿命。

好吧 嘿嘿