LINUX.ORG.RU

cuda — запутался с копированием

 ,


0

2

Казалось бы, функция в три строчки для копирования массива:

#include <cuda_runtime.h>
#include <stdexcept>

static cudaError_t crc;

template<typename T>
void gpu_allocate(T* g_ptr, size_t n){
	crc = cudaMalloc((T**)&g_ptr, sizeof(T)*n);
	if(crc) throw std::runtime_error("cudaMalloc Error");
}

template<typename T>
void gpu_copyin(T* src, T* g_dst, size_t n){
	crc = cudaMemcpy((void*)g_dst, (void*)src, sizeof(T)*n,cudaMemcpyHostToDevice);
	if(crc){
		throw std::runtime_error("cudaMemcpyHostToDevice Error");
	}
}

Аллокация проходит нормально, но копирование приводит к срабатыванию исключения:

cudaMemcpyHostToDevice float Error=11:invalid argument
ЧЯДНТ?

★★★★★

Последнее исправление: thunar (всего исправлений: 2)
template<typename T>
void gpu_allocate(T** g_ptr, size_t n){
	crc = cudaMalloc((void**)g_ptr, sizeof(T)*n);
	if(crc) throw std::runtime_error("cudaMalloc Error");
}
hizel ★★★★★
()

А почему проверка на НЕ_НОЛЬ, а не на cudaErrorMemoryAllocation? Есть гарантия, что константа не зависит от реализации?

Наверняка вам это известно, но в документации есть такое - «Calling cudaMemcpy() with dst and src pointers that do not match the direction of the copy results in an undefined behavior.»

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Ага, всё увидел. Совсем забыл что там нет никакой проверки типов.

thunar ★★★★★
() автор топика
Последнее исправление: thunar (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.