`cublasIsamin` returns 一个不正确的值

`cublasIsamin` returns an incorrect value

数组存储为xyzxyz...,我想得到某个方向(x or y or z)的最大值和最小值,这里是测试程序:

#include <cuda_runtime.h>
#include <cuda_runtime_api.h> // cudaMalloc, cudaMemcpy, etc.
#include <cublas_v2.h>
#include <helper_functions.h> // shared functions common to CUDA Samples
#include <helper_cuda.h>      // CUDA error checking

#include <stdio.h> // printf
#include <iostream>

template <typename T>
void print_arr(T *arr, int L)
{
    for (int i = 0; i < L; i++)
    {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
}

int main()
{
    float hV[10] = {3, 0, 7, 1, 2, 8, 6, 7, 6, 4};
    print_arr(hV, 10);

    float *dV;
    cudaMalloc(&dV, sizeof(float) * 10);
    cudaMemcpy(dV, hV, sizeof(float) * 10, cudaMemcpyHostToDevice);

    cublasHandle_t cublasHandle = NULL;
    checkCudaErrors(cublasCreate(&cublasHandle));

    int hResult[2] = {0};
    checkCudaErrors(cublasIsamax(cublasHandle, 10, dV, 3, hResult + 0));
    checkCudaErrors(cublasIsamin(cublasHandle, 10, dV, 3, hResult + 1));
    print_arr(hResult, 2);

    return 0;
}

预期结果:

3 0 7 1 2 8 6 7 6 4 
3 2

结果:

3 0 7 1 2 8 6 7 6 4 
3 5

这个结果有问题吗?还是我理解错了?

linkcublasIsamin.

cublasIsamin找到最小值的index。该索引不是在原始数组上计算的,但也会考虑 incx 参数。此外,它将搜索 n 个元素(第一个参数),而不考虑其他参数,例如 incx.

你有一个这样的数组:

index:    0 1 2 3 4 5 6 7 8 9
x/y/z:    x y z x y z x y z x
value:    3 0 7 1 2 8 6 7 6 4
x index:  1     2     3     4

因此,最小 x 值在索引 3 处,搜索总共 n=4(不是 10)个元素。关于 x 值,我们必须从偏移量 0 开始搜索 dV,增量为 3,最多 n=4 个元素。

考虑到所有这些,正确的调用是:

cublasIsamax(cublasHandle, 4, dV, 3, hResult + 0));
cublasIsamin(cublasHandle, 4, dV, 3, hResult + 1));

预期结果是:

3 2