cuốn sách gpt4 ai đã làm

java - cuMemcpyDtoH 产生 CUDA_ERROR_INVALID_VALUE

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 08:43:10 41 4
mua khóa gpt4 Nike

Tôi có một chương trình scala jcuda rất đơn giản có thêm một mảng rất lớn. Mọi thứ biên dịch và chạy tốt cho đến khi tôi muốn sao chép hơn 4 byte từ thiết bị của mình sang máy chủ. Khi tôi cố gắng sao chép nhiều hơn 4 byte, tôi nhận được CUDA_ERROR_INVALID_VALUE.

// Điều này gây nôn và tạo ra CUDA_ERROR_INVALID_VALUE
var HostOutput = new Array[Int](numElements)
cuMemcpyDtoH(
Con trỏ.to(hostOutput),
thiết bị đầu ra,
8
)

// Cái này chạy tốt
var HostOutput = new Array[Int](numElements)
cuMemcpyDtoH(
Con trỏ.to(hostOutput),
thiết bị đầu ra,
4
)

Để hiểu rõ hơn về chương trình thực tế, đây là mã hạt nhân của tôi, nó biên dịch và chạy tốt:

bên ngoài "C"
__global__ void add(int n, int *a, int *b, int *sum) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
nếu (tôi<>
{
tổng[i] = a[i] + b[i];
}
}

Sau đó, tôi đã dịch một số mã ví dụ java sang mã scala của mình. Dù sao, đây là toàn bộ chương trình đang chạy:

góidev

nhập jcuda.driver.JCudaDriver._

nhập jcuda._
nhập jcuda.driver._
nhập jcuda.runtime._

/**
* Được tạo bởi nhà phát triển vào ngày 7/6/15.
*/
đối tượng TestCuda {
chắc chắn ban đầu = {
JCudaDriver.setExceptionsEnabled(true)

//Vectơ đầu vào

// Vectơ đầu ra

// Tải mô-đun
// Tải file ptx.

val kernelPath = "/home/dev/IdeaProjects/jniopencl/src/main/resources/kernels/JCudaVectorAddKernel30.cubin"

cuInit(0)

thiết bị val = thiết bị CU mới
cuDeviceGet(thiết bị, 0)
bối cảnh val = CUcontext mới
cuCtxCreate(ngữ cảnh, 0, thiết bị)

//Tạo và tải mô-đun
mô-đun val = CUmodule mới()
cuModuleLoad(mô-đun, kernelPath)

// Lấy con trỏ hàm tới hàm kernel.
var add = newCUfunction()
cuModuleGetFunction(thêm, mô-đun, "thêm")

val numElements = 100000

val HostInputA = 1 đến numElements toArray
val HostInputB = 1 tới numElements toArray
giá trị SI: Int = Sizeof.INT.asInstanceOf[Int]

// Cấp phát dữ liệu đầu vào của thiết bị và sao chép
// máy chủ nhập dữ liệu vào thiết bị
var deviceInputA = CUdeviceptr mới
cuMemAlloc(deviceInputA, numElements *SI)
cuMemcpyHtoD(
thiết bịInputA,
Con trỏ.to(hostInputA),
numElements*SI
)

var deviceInputB = CUdeviceptr mới
cuMemAlloc(deviceInputB, numElements *SI)
cuMemcpyHtoD(
thiết bịInputB,
Con trỏ.to(hostInputB),
numElements*SI
)

// Cấp phát bộ nhớ đầu ra của thiết bị
val deviceOutput = new CUdeviceptr()
cuMemAlloc(deviceOutput, SI)

// Thiết lập tham số kernel: Con trỏ tới một mảng
// của các con trỏ trỏ tới giá trị thực tế.
val kernelParameters = Pointer.to(
Pointer.to(Array[Int](numElements)),
Con trỏ.to(deviceInputA),
Con trỏ.to(deviceInputB),
Con trỏ.to(deviceOutput)
)

// Gọi hàm kernel
khối valSizeX = 256
val GridSizeX = Math.ceil(numElements / blockSizeX).asInstanceOf[Int]
cuLaunchKernel(
thêm vào,
lướiSizeX, 1, 1,
khốiSizeX, 1, 1,
0, vô giá trị,
kernelParameter, null
)

cuCtxĐồng bộ hóa

// **** Code phát điên ở đây với lỗi đó
// Nếu tôi nhận xét điều này thì chương trình sẽ chạy tốt
var HostOutput = new Array[Int](numElements)
cuMemcpyDtoH(
Con trỏ.to(hostOutput),
thiết bị đầu ra,
số phần tử
)

HostOutput.foreach(print(_))
}
}

Dù sao, tôi chỉ cho bạn biết thông số kỹ thuật của máy tính của tôi. Tôi đang chạy Ubuntu 14.04 trên thiết lập tối ưu với thẻ GTX 770M hỗ trợ Điện toán 3.0. Tôi vẫn đang chạy NVCC phiên bản 5.5. Cuối cùng, tôi đang sử dụng Java 8 chạy scala phiên bản 2.11.6. Tôi là người mới và mọi trợ giúp đều được đánh giá cao.

câu trả lời hay nhất

đây

val deviceOutput = new CUdeviceptr()
cuMemAlloc(deviceOutput, SI)

bạn đang phân công SI Byte - tức là 4 byte, bằng kích thước của int. Việc ghi nhiều hơn 4 byte vào con trỏ thiết bị này có thể khiến mọi thứ trở nên khó hiểu. nên

cuMemAlloc(deviceOutput, SI * numElements)

Một lần nữa, tôi nghĩ cách gọi được đề cập nên là

cuMemcpyDtoH(
Con trỏ.to(hostOutput),
thiết bị đầu ra,
numElements*SI
)

(Lưu ý tham số cuối cùng *SI).

Về java - cuMemcpyDtoH tạo CUDA_ERROR_INVALID_VALUE, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/30797257/

41 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress