2010-10-18 46 views
2

我遇到了一個非常奇怪的問題:Mu 9800GT似乎根本不計算。 我試過所有你在互聯網上找到的世界,這裏有其中一個:Cuda不計算它的預期值,只是默默地忽略我的代碼

這個程序在主機上創建1..100的數組,將它發送到設備,計算每個值的平方,返回它承載,打印結果。

#include "stdafx.h" 

#include <stdio.h> 
#include <cuda.h> 

__global__ void square_array(float *a, int N) 
{ 
int idx = blockIdx.x * blockDim.x + threadIdx.x; 
if (idx<N) a[idx] = a[idx] * a[idx]; 
} 

// main routine that executes on the host 
int main(void) 
{ 
float *a_h, *a_d; // Pointer to host & device arrays 
const int N = 100; // Number of elements in arrays 
size_t size = N * sizeof(float); 
a_h = (float *)malloc(size); // Allocate array on host 
cudaMalloc((void **) &a_d, size); // Allocate array on device 
// Initialize host array and copy it to CUDA device 
for (int i=0; i<N; i++) a_h[i] = (float)i; 
cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice); 
// Do calculation on device: 
int block_size = 4; 
int n_blocks = N/block_size + (N%block_size == 0 ? 0:1); 
square_array <<< n_blocks, block_size >>> (a_d, N); 
// Retrieve result from device and store it in host array 
cudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost); 
// Print results 
for (int i=0; i<N; i++) printf("%d %f\n", i, a_h[i]); 
// Cleanup 
free(a_h); cudaFree(a_d); 
} 

所以輸出預期爲:

1 1.000

2 4.000

3 9.000

4 16.000

.. 我宣誓早在2009年它完美地工作(遠景32,deviceemu)

現在我得到輸出:

1 1.000

2 2.000

3 3.000

4 4.000

所以我的卡沒有做任何事情。可能是什麼問題? 配置爲: win7x64 Visual Studio 2010的32位 CUDA工具包3.2 64位

編譯設置:CUDA 3.2工具包,32位目標平臺,deviceemu或不 - 並不重要,結果是一樣的。

我也在我的vmware xp(32位)visual studio 2008上試過了。結果是一樣的。

請幫助我,我幾乎沒有編寫程序,現在我需要它的工作。

您也可以與所有需要查看我的項目從my post at nvidia forums(2.7 KB)

感謝,伊利亞

+0

嘿伊利亞, 我面對完全相同的問題,我首先在我的CUDA兼容桌面計算機上實現它,它完美地工作,當我轉移到超級計算機上時,我得到了確切的相同的輸出。 你認爲我應該做什麼? – 2011-01-24 15:03:53

回答

4

你的代碼產生我的Linux系統上預期的結果,所以我會建議檢查返回的錯誤代碼通過cudaMalloccudaMemcpy確保沒有無聲的驅動程序/運行時錯誤。例如

cudaError_t error = cudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost); 
printf("error status: %s\n", cudaGetErrorString(error)); 

應打印

error status: no error 

如果調用成功。

此外,相信設備仿真在CUDA 3.0棄用,完全在CUDA 3.1移除。我不知道這是否與你的問題有關。

編譯幾個文件你只是做這樣的事

$nvcc -c foo.cu 
$nvcc -c bar.cu 
$nvcc -o foobar foo.o bar.o 

或者,你可以做鏈接的最後一步與g++像這樣

$g++ -o foobar foo.o bar.o -L/usr/local/cuda/lib64 -lcudart 
+0

是的,算出來我自己:)錯誤cudaErrorInsufficientDriver = CUDA運行時比驅動程序更新。 現在將刪除所有驅動程序,重新啓動並從頭開始安裝它們 – 2010-10-18 09:55:10

+0

請在此處發佈您的g ++編譯字符串,並將其標記爲答案。 (我實際上需要它在ubuntu下運行,但不知道如何編譯多個文件:)) – 2010-10-18 10:27:39

相關問題