Cuda не рассчитывает, что ожидается, просто молча игнорирует мой код - PullRequest
2 голосов
/ 18 октября 2010

Я столкнулся с очень странной проблемой: Mu 9800GT, похоже, не рассчитывает вообще. Я перепробовал все привет-миры, которые нашел в интернете, вот один из них:

эта программа создает массив 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 году все работало идеально (Vista 32, Deviceemu)

теперь я получаю вывод:

1 1.000

2 2.000

3 3.000

4 4.000

так что моя карта ничего не делает. В чем может быть проблема? Конфигурация это: Win7x64 Визуальная студия 2010 32bit cuda toolkit 3.2 64bit

Настройки компиляции: cuda 3.2 toolkit, 32-битная целевая платформа, deviceemu или нет - не имеет значения, результаты одинаковы.

Я также попробовал это на моей vmware xp (32bit) visual studio 2008. Результат тот же.

Пожалуйста, помогите мне, я едва сделал программу для компиляции, теперь мне нужно, чтобы она работала.

Вы также можете просмотреть мой проект со всем, что ему нужно от моего поста на форумах nvidia (2,7 кб)

Спасибо, Илья

1 Ответ

4 голосов
/ 18 октября 2010

Ваш код дает ожидаемые результаты в моей системе Linux, поэтому я бы посоветовал проверить коды ошибок, возвращаемые cudaMalloc и cudaMemcpy, чтобы убедиться, что нет ошибок в драйвере / во время выполнения. Например

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...